{
  "openapi": "3.1.0",
  "info": {
    "title": "Открытый API",
    "description": "Открытый API MoreLogin предлагает комплексный и удобный для разработчиков RESTful-интерфейс, позволяющий программно управлять профилями браузеров, облачными телефонами и связанными ресурсами, обеспечивая бесперебойную автоматизацию, масштабируемость и контроль. Открытый API MoreLogin работает на вашем компьютере и доступен по адресу: https://api.morelogin.com",
    "version": "2026-09-05"
  },
  "tags": [
    {
      "name": "Authorization",
      "description": "API для раздела «Authorization»."
    },
    {
      "name": "Cloud Phone Management",
      "description": "API для раздела «Cloud Phone Management»."
    },
    {
      "name": "Live Streaming",
      "description": "Запуск, проверка и остановка прямой трансляции Cloud Phone."
    },
    {
      "name": "Account & Quotas",
      "description": "Проверка баланса кошелька и доступных ресурсов Cloud Phone."
    },
    {
      "name": "ADB",
      "description": "API для раздела «ADB»."
    },
    {
      "name": "Files",
      "description": "API для раздела «Files»."
    },
    {
      "name": "Apps",
      "description": "API для раздела «Apps»."
    },
    {
      "name": "Schedules",
      "description": "API для раздела «Schedules»."
    },
    {
      "name": "Touch",
      "description": "API для раздела «Touch»."
    },
    {
      "name": "Proxy Management",
      "description": "API для раздела «Proxy Management»."
    },
    {
      "name": "Group Management",
      "description": "API для раздела «Group Management»."
    },
    {
      "name": "Tag Management",
      "description": "API для раздела «Tag Management»."
    },
    {
      "name": "Monthly Billing",
      "description": "Получение доступных месячных тарифов и активация Cloud Phone на месяц."
    }
  ],
  "x-tagGroups": [
    {
      "name": "",
      "tags": [
        "Authorization",
        "Cloud Phone Management",
        "Live Streaming",
        "Account & Quotas",
        "ADB",
        "Files",
        "Apps",
        "Schedules",
        "Touch",
        "Monthly Billing"
      ]
    }
  ],
  "paths": {
    "/balance": {
      "get": {
        "operationId": "getAccountAndCloudPhoneQuotas",
        "summary": "Получить баланс и доступные ресурсы Cloud Phone",
        "description": "Возвращает баланс кошелька команды и доступные объёмы использования облачных телефонов.\n- **Предварительные условия**: вызывающему участнику нужно право на расходы. Кошелёк ищется по команде, поэтому эти цифры относятся ко всей команде, а не к отдельному участнику.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Единицы**: `balance` — баланс кошелька **в центах**, а не в денежных единицах. `remainingDuration` — остаток минут облачного телефона, `remainingConcurrency` — число слотов; оба ограничиваются нулём и не уходят в минус.\n- **Содержимое**: ровно эти три числа. Замороженные суммы кошелька, разделение израсходованных и выданных минут и даты истечения существуют выше по стеку, но здесь намеренно не публикуются.\n- **Примечание**: вызов падает целиком, если не удался запрос кошелька или запрос квот; частичные цифры он не возвращает.",
        "tags": [
          "Account & Quotas"
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BalanceResponse"
          }
        }
      }
    },
    "/cloudphone/monthly/skus": {
      "get": {
        "operationId": "listMonthlyCloudPhoneSkus",
        "summary": "Список доступных месячных тарифов Cloud Phone",
        "description": "Возвращает месячные продукты Cloud Phone, доступные команде.\n\n- **Эффект**: отсутствует; запрос не резервирует ёмкость и не списывает баланс. Только чтение.\n- **Использование**: передайте полученный `skuId` в [`/cloudphone/create`](./open-api.yaml#operation/createUsingPOST). Цена указана в центах США, срок — 30 дней.\n- **Пустой результат**: пустой массив `data` означает, что доступных месячных продуктов нет.\n\nТиповые ошибки см. в [Error Codes](../Getting%20Started/error-codes.md).",
        "tags": [
          "Monthly Billing"
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/MonthlyCloudPhoneSkusResponse"
          }
        }
      }
    },
    "/cloudphone/monthly/activate": {
      "post": {
        "operationId": "activateMonthlyCloudPhones",
        "summary": "Покупка и активация Cloud Phone на месяц",
        "description": "Покупает и активирует от 1 до 10 месячных Cloud Phone на 30 дней.\n\n- **Предупреждение**: **операция реально списывает средства с баланса команды.**\n- **Разрешение**: требуется право **Управление расходами/платежами**, иначе возвращается `99012`.\n- **Сначала создайте**: используйте [`/cloudphone/create`](./open-api.yaml#operation/createUsingPOST); создание даёт неактивные записи и не списывает средства.\n- **Выбор**: ID должны быть уникальными, принадлежать команде и использовать активные 30-дневные продукты. Разные месячные SKU можно смешивать. Несовместимые состояния оплаты или заказы, ожидающие клиентские заказы и параллельные покупки отклоняют весь запрос.\n- **Списание и восстановление**: проверка и списание выполняются целиком. Для одного оплаченного заказа право восстанавливается без повторного списания. Local API, Open API и клиент используют общее состояние заказа.\n- **Завершение**: подтверждает 30 дней для всех устройств; не включает их и не включает автопродление.\n- **Неподтверждённая активация**: при `33422` `data.results` остаётся полным и упорядоченным. Проверьте `status`, `expireTime`, `errorCode`.\n- **Повтор**: после таймаута запросите [`/cloudphone/info`](./open-api.yaml#operation/infoUsingPOST) или [`/cloudphone/page`](./open-api.yaml#operation/pageUsingPOST).\n\nОшибки: `20002`, `20003`, `20004`, `20008`, `20041`, `20055`, `20068`, `20070`, `20071`, `33420`, `33421`, `33422`, `99001`, `99002`, `99012`. См. [Error Codes](../Getting%20Started/error-codes.md).",
        "tags": [
          "Monthly Billing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MonthlyCloudPhoneActivateRequest"
              },
              "example": {
                "ids": [
                  "1724032706822188",
                  "1724032729890861"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/MonthlyCloudPhoneActivateResponse"
          }
        }
      }
    },
    "/cloudphone/live/start": {
      "post": {
        "operationId": "startCloudPhoneLiveStreaming",
        "summary": "Начать прямую трансляцию",
        "description": "Запускает прямую трансляцию ранее загруженного MP4 на облачном телефоне.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды, и его Сервис должен поддерживать прямые трансляции . `fileId` должен ссылаться на файл, загруженный как медиа для трансляции, загрузка которого завершилась; всё остальное отклоняется как недопустимое или истёкшее.\n- **Завершение**: **принято, но не завершено.** Ответ лишь подтверждает, что Сервис принял запрос. Опрашивайте `/cloudphone/live/status`, пока `liveStatus` не станет `1`.\n- **Примечание**: ограничение «только MP4» применяется при загрузке файла, а не здесь.\n- **Повтор**: дедупликации нет; повторный вызов заново отправляет команду запуска.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`, `33401`, `33418`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "tags": [
          "Live Streaming"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneLiveStartRequest"
              },
              "example": {
                "phoneId": "190000000000000001",
                "fileId": "820000000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudPhoneLiveBooleanResponse"
          }
        }
      }
    },
    "/cloudphone/live/status": {
      "post": {
        "operationId": "getCloudPhoneLiveStreamingStatus",
        "summary": "Получить статус трансляции",
        "description": "Сообщает, ведёт ли облачный телефон прямую трансляцию в данный момент.\n- **Предварительные условия**: телефон должен принадлежать вашей команде, а его Сервис — поддерживать прямые трансляции. В отличие от запуска и остановки, телефону **не** нужно быть включённым или занятым вами.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Значения**: `liveStatus` равен `0` (трансляции нет) или `1` (идёт трансляция). **Состояния ошибки не существует**: запуск, который так и не сработал, просто остаётся в `0`, поэтому ограничьте опрос таймаутом.\n\nЗадокументированные бизнес-ошибки: `33300`, `33401`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "tags": [
          "Live Streaming"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneLivePhoneRequest"
              },
              "example": {
                "phoneId": "190000000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudPhoneLiveStatusResponse"
          }
        }
      }
    },
    "/cloudphone/live/end": {
      "post": {
        "operationId": "stopCloudPhoneLiveStreaming",
        "summary": "Остановить прямую трансляцию",
        "description": "Останавливает прямую трансляцию на облачном телефоне.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды, и его Сервис должен поддерживать прямые трансляции. **Идёт ли трансляция в действительности, не проверяется**: команда остановки отправляется в любом случае.\n- **Завершение**: принято, но не завершено. Опрашивайте `/cloudphone/live/status`, пока `liveStatus` не станет `0`.\n- **Повтор**: идемпотентен по результату; повторный вызов просто отправляет команду остановки снова.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`, `33401`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "tags": [
          "Live Streaming"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneLivePhoneRequest"
              },
              "example": {
                "phoneId": "190000000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/CloudPhoneLiveBooleanResponse"
          }
        }
      }
    },
    "/oauth2/token": {
      "post": {
        "operationId": "oauth2TokenPost",
        "summary": "Токен доступа",
        "deprecated": false,
        "description": "Обменивает API ID и API-ключ на bearer-токен OAuth2.\n- **Предварительные условия**: `client_id` — это API ID, а `client_secret` — API-ключ. Участник должен быть активен, а IP вызывающего должен пройти списки разрешённых и запрещённых IP для Open API.\n- **Эффект**: отсутствует — токен самоподписанный, на сервере ничего не сохраняется.\n- **Срок действия**: `expires_in` секунд, по умолчанию 3600. **Ни refresh-токена, ни эндпоинта обновления нет**; вместо этого запросите новый токен.\n- **Параллелизм**: поскольку токены не имеют состояния, выпуск нового **не** аннулирует предыдущие — одновременно могут быть действительны несколько. Токен перестаёт работать только по истечении срока или при ротации API-ключа.\n- **Повтор**: безопасен.\n\nЗадокументированные бизнес-ошибки: `12002`, `35002`, `35005`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "tags": [
          "Authorization"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "client_id": {
                    "description": "Идентификатор API (API ID) идентифицирует участника.",
                    "type": "string"
                  },
                  "client_secret": {
                    "description": "Ключ API используется для аутентификации идентификатора клиента. Для вызова API MoreLogin вам потребуется\nобменять свой идентификатор API и ключ API на токен доступа. Храните этот\nсекрет в безопасности.\n\n",
                    "type": "string"
                  },
                  "grant_type": {
                    "description": "Название пакета — требуется только в том случае, если не указан appVersionId.",
                    "type": "string",
                    "example": "client_credentials"
                  }
                },
                "required": [
                  "client_id",
                  "client_secret",
                  "grant_type"
                ]
              },
              "example": {
                "client_id": "1661515884160372",
                "client_secret": "string",
                "grant_type": "client_credentials"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — объект с полями `scope`, `access_token`, `token_type`, `expires_in` и `client_metadata`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "scope": {
                          "type": "string"
                        },
                        "access_token": {
                          "type": "string"
                        },
                        "token_type": {
                          "type": "string"
                        },
                        "expires_in": {
                          "type": "integer"
                        },
                        "client_metadata": {
                          "type": "object",
                          "properties": {
                            "name": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "name"
                          ],
                          "x-apidog-orders": [
                            "name"
                          ],
                          "x-apidog-ignore-properties": []
                        }
                      },
                      "required": [
                        "scope",
                        "access_token",
                        "token_type",
                        "expires_in",
                        "client_metadata"
                      ],
                      "x-apidog-orders": [
                        "scope",
                        "access_token",
                        "token_type",
                        "expires_in",
                        "client_metadata"
                      ],
                      "x-apidog-ignore-properties": []
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ],
                  "x-apidog-orders": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ],
                  "x-apidog-ignore-properties": []
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "scope": "cloudphone",
                    "access_token": "example-access-token\n",
                    "token_type": "Bearer",
                    "expires_in": 3600,
                    "client_metadata": {
                      "name": "team name"
                    }
                  },
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            },
            "headers": {},
            "x-apidog-name": "成功",
            "x-apidog-ordering": 0
          }
        },
        "security": []
      }
    },
    "/oauth2/userinfo": {
      "get": {
        "operationId": "oauth2UserinfoGet",
        "summary": "Информация о пользователе",
        "deprecated": false,
        "description": "Возвращает участника и команду, которым принадлежит текущий токен доступа.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Применение**: самый дешёвый способ проверить, что токен ещё действителен, и узнать команду, к которой он привязан.",
        "tags": [
          "Authorization"
        ],
        "responses": {
          "200": {
            "description": "Успех. `data` — объект с полями `teamId`, `teamName`, `memberId`, `memberNickName` и `memberEmail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "teamId": {
                          "type": "string"
                        },
                        "teamName": {
                          "type": "string"
                        },
                        "memberId": {
                          "type": "string"
                        },
                        "memberNickName": {
                          "type": "string"
                        },
                        "memberEmail": {
                          "type": "string"
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "teamId": "1673823102599682",
                    "teamName": "example-name",
                    "memberId": "1673823102599682",
                    "memberNickName": "example-name",
                    "memberEmail": "string"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/uploadUrl": {
      "post": {
        "summary": "Получить URL для загрузки файла",
        "deprecated": false,
        "description": "Запрашивает предподписанный URL для загрузки файла, который получит облачный телефон.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды.\n- **Эффект**: ничего не сохраняется — URL формируется на месте.\n- **Завершение**: синхронное. **Предподписанный URL действителен один час.** Отправьте содержимое файла методом `PUT`, а затем зарегистрируйте загрузку через эндпоинт регистрации; регистрация до появления объекта отклоняется.\n- **Примечание**: повторная загрузка того же имени файла перезаписывает предыдущий объект. Временные объекты удаляются автоматически через 7 дней.",
        "operationId": "get",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Cloud phone ID"
                  },
                  "fileName": {
                    "type": "string",
                    "description": "Upload file name"
                  }
                },
                "required": [
                  "id",
                  "fileName"
                ]
              },
              "example": {
                "fileName": "live-video.mp4",
                "id": "1661515884160372"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `presignedUrl`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Return result code 0:Normal Other codes are exceptions."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "error message\n"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "presignedUrl": {
                          "type": "string",
                          "description": "File upload URL use https PUT uploading files to cloud storage"
                        }
                      },
                      "required": [
                        "presignedUrl"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "presignedUrl": "https://example.com/resource"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/uploadFile": {
      "post": {
        "summary": "Загрузка файлов",
        "deprecated": false,
        "description": "Регистрирует ранее загруженный файл, чтобы облачный телефон его скачал.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды, и **объект уже должен существовать по указанному URL**: служба проверяет его и отклоняет запрос, если прочитать объект не удаётся. Загрузки для прямой трансляции должны быть в MP4 и предназначаться Сервису, поддерживающему трансляции.\n- **Завершение**: **принято, но не завершено.** Ответ возвращает `fileId` со статусом «в процессе». Опрашивайте эндпоинт результата загрузки, пока статус не станет успешным или ошибочным.\n- **Повтор**: дедупликации нет; каждый вызов создаёт новый `fileId`.\n- **Примечание о поверхности API**: в Local API этот путь — другой, более старый multipart-сценарий. Аналог этого эндпоинта в Local API — `/api/cloudphone/upload/file`.\n\nЗадокументированные бизнес-ошибки: `33401`, `33419`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "fileUploadUsing",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "Cloud phone ID",
                    "type": "string",
                    "example": "1661515884160372"
                  },
                  "url": {
                    "type": "string",
                    "description": "Object URL obtained from `presignedUrl` after the file bytes have been uploaded, or another publicly accessible download URL",
                    "example": "https://storage.example.com/cloudphone/test.jpg"
                  },
                  "uploadDest": {
                    "description": "Upload destination directory",
                    "type": "string",
                    "example": "/Download"
                  },
                  "uploadType": {
                    "type": "integer",
                    "enum": [
                      1,
                      2
                    ],
                    "default": 1,
                    "description": "File type (`1` = regular file, `2` = MP4 live-streaming file)"
                  }
                },
                "required": [
                  "id",
                  "url",
                  "uploadDest"
                ]
              },
              "example": {
                "id": "1661515884160372",
                "url": "https://storage.example.com/cloudphone/live-video.mp4",
                "uploadDest": "/Download",
                "uploadType": 2
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `fileId`, `id` and `status`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "fileId": {
                          "type": "string",
                          "description": "Uploaded file ID"
                        },
                        "id": {
                          "type": "string"
                        },
                        "status": {
                          "type": "integer",
                          "description": "Upload status 0:uploading 1:success 2:failed"
                        }
                      },
                      "required": [
                        "fileId",
                        "id",
                        "status"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "fileId": "1661515884160111",
                    "id": "1661515884160372",
                    "status": 1
                  },
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/uploadFileResult": {
      "post": {
        "summary": "результат загрузки файла",
        "deprecated": false,
        "description": "Опрашивает статус загрузки файла на облачный телефон.\n- **Предварительные условия**: телефон должен принадлежать вашей команде. Это наименее ограниченный файловый эндпоинт: он не требует, чтобы телефон был включён или занят вами.\n- **Значения**: `0` загружается, `1` успешно, `2` ошибка.\n- **Пустой результат**: если `fileId` не найден, вызов всё равно завершается успехом, но `data` равен null. Трактуйте это как «пока не видно или уже отсутствует», а не как сбой.\n- **Стоимость**: запрос обходит список файлов Сервиса, поэтому он не дешёвый. Опрашивайте с умеренным интервалом, а не в плотном цикле.",
        "operationId": "fileUploadResult",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "Cloud phone ID",
                    "type": "string",
                    "example": "1661515884160372"
                  },
                  "fileId": {
                    "type": "string",
                    "description": "Uploaded file ID"
                  }
                },
                "required": [
                  "id",
                  "fileId"
                ]
              },
              "example": {
                "id": "1661515884160372",
                "fileId": "1661515884160372"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `fileId`, `id` and `status`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "fileId": {
                          "type": "string",
                          "description": "Uploaded file ID"
                        },
                        "status": {
                          "type": "integer",
                          "description": "Upload status 0:uploading 1:success 2:failed"
                        }
                      },
                      "required": [
                        "fileId",
                        "id",
                        "status"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1661515884160372",
                    "fileId": "1661515884160111",
                    "status": 1
                  },
                  "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/download": {
      "post": {
        "operationId": "cloudphoneDownloadPost",
        "summary": "Загрузка файла",
        "deprecated": false,
        "description": "Скачивает файл с облачного телефона.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды.\n- **Эффект**: служба сначала обходит родительский каталог и только затем начинает передачу, поэтому несуществующий путь приводит к ошибке **здесь**, а не при опросе статуса. Цель должна быть обычным файлом, а не каталогом.\n- **Завершение**: **принято, но не завершено.** Ответ возвращает `downId`; опрашивайте `/cloudphone/download/result`, пока статус не станет успешным, ошибочным или отменённым. Этот эндпоинт заново проверяет, что телефон по-прежнему включён и по-прежнему занят вами.\n- **Повтор**: не идемпотентно — каждый вызов заново обходит каталог и выдаёт новый `downId`.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`, `33507`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "cloud phone id"
                  },
                  "filePath": {
                    "type": "string",
                    "description": "file path: /sdcard/Download/a.txt\n"
                  }
                },
                "required": [
                  "filePath",
                  "id"
                ]
              },
              "example": {
                "filePath": "/sdcard/Download/report.csv",
                "id": "1661515884160372"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `id` and `downId`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Cloud phone id"
                        },
                        "downId": {
                          "type": "string",
                          "description": "File download id "
                        }
                      },
                      "required": [
                        "id",
                        "downId"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": "",
                  "data": {
                    "id": "1661515884160372",
                    "downId": "1661515884160999"
                  },
                  "requestId": "7dcf166a597842139af5ce12d25fe0f8"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/download/result": {
      "post": {
        "operationId": "cloudphoneDownloadResultPost",
        "summary": "Результат загрузки файла",
        "deprecated": false,
        "description": "Опрашивает статус скачивания файла с облачного телефона.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Передайте `downId`, возвращённый запросом на скачивание.\n- **Значения**: **шкала отличается от загрузки**: `10` выполняется, `20` успешно, `30` ошибка, `40` отменено. `downUrl` заполняется только после успешного скачивания.\n- **Примечание**: случай «файл не существует» сообщает сам запрос на скачивание, который сначала обходит родительский каталог, а не этот эндпоинт.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "cloud phone id"
                  },
                  "downId": {
                    "type": "string",
                    "description": "file download id"
                  }
                },
                "required": [
                  "downId",
                  "id"
                ]
              },
              "example": {
                "downId": "1661515884160999",
                "id": "1661515884160372"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Success. `data` is an object with the fields `status`, `downId` and `downUrl`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Response code, 0 indicates success,>0 indicates failure"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "integer",
                          "description": "Download file status;10:Running, 20:Successful, 30:Failed, 40:Cancelled"
                        },
                        "downUrl": {
                          "type": "string",
                          "description": "File download URL; use it only when status is 20"
                        },
                        "downId": {
                          "type": "string",
                          "description": "File download task ID"
                        }
                      },
                      "required": [
                        "status",
                        "downId"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "status": 20,
                    "downId": "1661515884160999",
                    "downUrl": "https://get.morelogin.com/..."
                  },
                  "requestId": "17d9dbfd958e4f40a51897520138d3ff"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/setKeyBox": {
      "post": {
        "operationId": "cloudphoneSetKeyBoxPost",
        "summary": "Установить Keybox",
        "deprecated": false,
        "description": "Устанавливает сертификат keybox на облачный телефон.\n- **Предварительные условия**: `filePath` должен указывать на файл `.xml`, и облачный телефон должен быть включён и не должен быть занят другим участником команды.\n- **Эффект**: передаёт путь к сертификату Сервису устройства. MoreLogin ничего не сохраняет, и служба не определяет шага активации: нужна ли устройству перезагрузка, чтобы сертификат вступил в силу, определяется поведением Сервиса.\n- **Завершение**: синхронное принятие Сервисом. Эндпоинта, сообщающего об установленном сертификате, нет.",
        "tags": [
          "Files"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "filePath": {
                    "type": "string",
                    "description": "Путь к файлу, например, /sdcard/Download/xxx.xml"
                  },
                  "id": {
                    "type": "string",
                    "description": "Идентификатор телефона в облаке"
                  }
                }
              },
              "example": {
                "filePath": "",
                "id": "0"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — одно значение типа boolean.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 = успех, >0 = ошибка"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/install": {
      "post": {
        "operationId": "cloudphoneAppInstallPost",
        "summary": "Установите приложение на облачный телефон.",
        "deprecated": false,
        "description": "Устанавливает приложение из библиотеки команды на облачный телефон.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Приложение уже должно существовать в библиотеке команды или в публичном каталоге; укажите его либо через `appVersionId`, либо через `packageName` вместе с `versionCode`. Оно также должно быть загружено Сервису, обслуживающему этот телефон, иначе установка не удастся.\n- **Ограничение частоты**: не более одной установки на телефон в секунду; более быстрый повторный вызов отклоняется.\n- **Завершение**: **принято, но не завершено.** Ответ лишь подтверждает, что запрос поставлен в очередь. Опрашивайте `/cloudphone/app/installedList`, чтобы увидеть, дошло ли приложение.\n- **Повтор**: безопасен после проверки списка установленных, с учётом ограничения одного вызова в секунду.\n\nЗадокументированные бизнес-ошибки: `33005`, `33014`, `33714`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "appVersionId": {
                    "description": "Идентификатор версии приложения",
                    "type": "string"
                  },
                  "id": {
                    "description": "Идентификатор телефона в облаке",
                    "type": "string"
                  },
                  "packageName": {
                    "description": "Название пакета — требуется только в том случае, если не указан appVersionId.",
                    "type": "string"
                  },
                  "versionCode": {
                    "description": "Код версии — требуется только в том случае, если не указан appVersionId.",
                    "type": "integer"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "appVersionId": "1672940217990530",
                "id": "1673823102599682"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — одно значение типа boolean.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/page": {
      "post": {
        "operationId": "cloudphoneAppPagePost",
        "summary": "Получить список приложений",
        "deprecated": false,
        "description": "Выводит приложения, которые можно установить на облачный телефон.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке. Облачный телефон не задействован, поэтому он не обязан быть запущен.\n- **Содержимое**: публичный каталог приложений, то есть глобально доступные приложения плюс опубликованные для вашей команды. Каждая запись содержит свои версии в `appVersionList`, начиная с самых новых; берите `appVersionList[].id` как `appVersionId` для `/cloudphone/app/install`.\n- **Особенность пагинации**: результаты пересортировываются после получения страницы, поэтому порядок стабилен только внутри страницы, а `total` отражает текущую страницу, а не весь каталог. Для навигации используйте `pages`.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "appName": {
                    "description": "Название приложения (частичное совпадение)",
                    "type": "string"
                  },
                  "pageNum": {
                    "description": "Номер страницы; по умолчанию: 1",
                    "type": "integer"
                  },
                  "pageSize": {
                    "description": "Элементов на странице; по умолчанию: 10",
                    "type": "integer"
                  }
                }
              },
              "example": {
                "appName": "de",
                "pageNum": 1,
                "pageSize": 10
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data.dataList` содержит приложения, доступные вашей команде на запрошенной странице; версии каждого приложения находятся в `appVersionList`, новые первыми. `data.total` — число записей на текущей странице, а не общее количество; для постраничной навигации используйте `data.pages`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "total": {
                          "type": "string",
                          "description": "Число записей на текущей странице"
                        },
                        "current": {
                          "type": "string",
                          "description": "Номер текущей страницы"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Общее число страниц"
                        },
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "Идентификатор приложения. Это не то значение, которое ожидает `/cloudphone/app/install`."
                              },
                              "appName": {
                                "type": "string",
                                "description": "Название приложения"
                              },
                              "appIcon": {
                                "type": "string",
                                "description": "URL значка приложения"
                              },
                              "packageName": {
                                "type": "string",
                                "description": "Имя пакета Android"
                              },
                              "categoryValue": {
                                "type": "integer",
                                "description": "Идентификатор категории"
                              },
                              "sortNo": {
                                "type": "integer",
                                "description": "Порядок сортировки в библиотеке приложений"
                              },
                              "appVersionList": {
                                "type": "array",
                                "description": "Версии приложения, отсортированные по `versionCode` по убыванию (новые первыми)",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "id": {
                                      "type": "string",
                                      "description": "Идентификатор версии приложения. Передайте его как `appVersionId` в `/cloudphone/app/install`."
                                    },
                                    "versionCode": {
                                      "type": "string",
                                      "description": "Код версии"
                                    },
                                    "versionName": {
                                      "type": "string",
                                      "description": "Отображаемое имя версии"
                                    },
                                    "installStatus": {
                                      "type": [
                                        "integer",
                                        "null"
                                      ],
                                      "description": "Для этой операции всегда null. Состояние установки запрашивайте через `/cloudphone/app/installedList`."
                                    },
                                    "packageName": {
                                      "type": [
                                        "string",
                                        "null"
                                      ],
                                      "description": "Для этой операции всегда null; используйте `packageName` уровня приложения."
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "total": "1",
                    "current": "1",
                    "pages": "1",
                    "dataList": [
                      {
                        "id": "1672940217990529",
                        "appName": "Depop",
                        "appIcon": "https://cdn.morelogin.com/app/depop.png",
                        "packageName": "com.depop",
                        "categoryValue": 1,
                        "sortNo": 0,
                        "appVersionList": [
                          {
                            "id": "1672940217990530",
                            "versionCode": "450000000",
                            "versionName": "4.50.0",
                            "installStatus": null,
                            "packageName": null
                          }
                        ]
                      }
                    ]
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/team/app/page": {
      "post": {
        "operationId": "cloudphoneTeamAppPagePost",
        "summary": "Список приложений команды",
        "deprecated": false,
        "description": "Выводит собственную библиотеку приложений вашей команды, включая предустановленные приложения.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Содержимое**: источник отличается от `/cloudphone/app/page`: здесь приложения, загруженные вашей командой, возвращаемые плоским списком (по строке на версию приложения), а не вложенными по версиям. Записи содержат статус проверки; пока идёт обновление, поля статуса описывают **версию, которая обновляется**, а не действующую.\n- **Примечание**: фильтрация по нераспознанному Сервису даёт пустую страницу, а не ошибку.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "appName": {
                    "description": "Название приложения (частичное совпадение)",
                    "type": "string"
                  },
                  "pageNo": {
                    "description": "Текущая страница; по умолчанию 1",
                    "type": "integer"
                  },
                  "pageSize": {
                    "description": "Элементов на странице; по умолчанию 10",
                    "type": "integer"
                  }
                }
              },
              "example": {
                "appName": "TikTok",
                "pageNo": 1,
                "pageSize": 10
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data.dataList` содержит записи запрошенной страницы и является пустым массивом при отсутствии совпадений; `data.total`, `data.current` и `data.pages` описывают постраничную разбивку.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseDataPageResultCloudPhoneAppDto"
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "total": "15",
                    "current": "1",
                    "pages": "2",
                    "dataList": [
                      {
                        "id": "123456",
                        "appName": "Facebook",
                        "packageName": "com.facebook.katana",
                        "versionName": "450.0.0.1",
                        "versionCode": "450000000",
                        "enabled": true,
                        "desc": "Social media application",
                        "enableRoot": false
                      }
                    ]
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/installedList": {
      "post": {
        "operationId": "cloudphoneAppInstalledListPost",
        "summary": "Запрос списка установленных приложений",
        "deprecated": false,
        "description": "Выводит приложения, установленные на облачном телефоне в данный момент.\n- **Предварительные условия**: телефон должен принадлежать вашей команде. В отличие от большинства команд облачного телефона, занимать его **не** требуется, но Сервис опрашивается в реальном времени, поэтому выключенный телефон обычно приводит к ошибке на стороне Сервиса, а не к ошибке MoreLogin.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Применение**: это сигнал завершения для `/cloudphone/app/install` и `/cloudphone/app/uninstall`. Названия и иконки приложений подставляются из каталога; пакеты, отсутствующие в каталоге, возвращаются как есть.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "Идентификатор телефона в облаке",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1674550360293464"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — массив объектов с полями `appName`, `appIcon`, `packageName`, `versionCode` и `versionName`; пустой массив, если возвращать нечего.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "appName": {
                            "type": "string"
                          },
                          "appIcon": {
                            "type": "string"
                          },
                          "packageName": {
                            "type": "string"
                          },
                          "versionCode": {
                            "type": "string"
                          },
                          "versionName": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    {
                      "appName": "example-name",
                      "appIcon": "string",
                      "packageName": "example-name",
                      "versionCode": "string",
                      "versionName": "example-name"
                    }
                  ],
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/start": {
      "post": {
        "operationId": "cloudphoneAppStartPost",
        "summary": "Запустить приложение",
        "deprecated": false,
        "description": "Запускает установленное приложение на облачном телефоне.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды.\n- **Завершение**: ответ подтверждает, что команда дошла до Сервиса, а не что приложение оказалось на переднем плане. Эндпоинта, сообщающего о запущенном приложении, нет: проверяйте снимком экрана или shell-командой.\n- **Повтор**: дедупликации нет; повторный вызов отправляет команду снова.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "description": "Идентификатор телефона в облаке",
                    "type": "string"
                  },
                  "packageName": {
                    "description": "Название пакета приложения",
                    "type": "string"
                  }
                },
                "required": [
                  "id",
                  "packageName"
                ]
              },
              "example": {
                "id": "1674550360293464",
                "packageName": "com.depop"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` для этой операции всегда null; результат передаётся через `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "null"
                    },
                    "requestId": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/restart": {
      "post": {
        "operationId": "cloudphoneAppRestartPost",
        "summary": "Перезапустите приложение",
        "deprecated": false,
        "description": "Перезапускает приложение на облачном телефоне.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. **Наличие приложения не проверяется**: отсутствующий пакет просто ни к чему не приведёт.\n- **Завершение**: ответ подтверждает, что команда отправлена Сервису, а не что приложение перезапустилось. Проверьте через `/cloudphone/app/installedList` или наблюдая за устройством.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Идентификатор телефона в облаке"
                  },
                  "packageName": {
                    "type": "string",
                    "description": "Название пакета приложения"
                  }
                }
              },
              "example": {
                "id": "0",
                "packageName": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — одно значение типа boolean.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 = успех, >0 = ошибка"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ответе, сообщение об ошибке возвращается, если код > 0."
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  },
                  "required": [
                    "msg"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": true,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/stop": {
      "post": {
        "operationId": "cloudphoneAppStopPost",
        "summary": "Остановить приложение",
        "deprecated": false,
        "description": "Останавливает запущенное приложение на облачном телефоне.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Установлено ли приложение и запущено ли оно — не проверяется.\n- **Завершение**: ответ подтверждает, что команда отправлена Сервису, а не что приложение остановилось.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Идентификатор телефона в облаке"
                  },
                  "packageName": {
                    "type": "string",
                    "description": "Название пакета приложения"
                  }
                }
              },
              "example": {
                "id": "0",
                "packageName": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — одно значение типа boolean.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 = успех, >0 = ошибка"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение; заполняется, если код > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/uninstall": {
      "post": {
        "operationId": "cloudphoneAppUninstallPost",
        "summary": "Удалите приложение",
        "deprecated": false,
        "description": "Удаляет приложение с облачного телефона.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды.\n- **Эффект**: отправляет удаление и обновляет запись об установках для этого телефона.\n- **Завершение**: ответ подтверждает, что запрос принят. Проверьте через `/cloudphone/app/installedList`.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Идентификатор телефона в облаке"
                  },
                  "packageName": {
                    "type": "string",
                    "description": "Название пакета приложения"
                  }
                }
              },
              "example": {
                "id": "0",
                "packageName": ""
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — одно значение типа boolean.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 = успех, >0 = ошибка"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение; заполняется, если код > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/openRoot": {
      "post": {
        "tags": [
          "Apps"
        ],
        "summary": "Включение ROOT для приложения",
        "description": "Выдаёт ROOT конкретным пакетам приложений на облачном телефоне.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Поддерживается на совместимых устройствах; у других Сервисов вызов проходит успешно, но не даёт эффекта.\n- **Эффект**: отправляет на устройство список разрешённых пакетов и, как побочный эффект, включает переключатель ROOT. **MoreLogin ничего не сохраняет**, поэтому выданные права нельзя прочитать через API.\n- **Завершение**: синхронное принятие Сервисом. Когда ROOT фактически вступит в силу на устройстве, определяется поведением Сервиса; MoreLogin не перезагружает телефон.\n- **Примечание**: сейчас нет эндпоинта для отзыва ROOT у отдельных пакетов. Чтобы выключить глобальный переключатель, используйте `/cloudphone/enableRoot`.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "cloudphoneAppOpenRootPost",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApiAppRootOperateDto"
              },
              "example": {
                "id": "12345678",
                "packageNames": [
                  "com.test"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — одно значение типа boolean.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 = успех, >0 = ошибка"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение; заполняется при code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/app/setHideAccessibilityApp": {
      "post": {
        "operationId": "cloudphoneAppSetHideAccessibilityAppPost",
        "summary": "Скрыть приложение для людей с ограниченными возможностями",
        "deprecated": false,
        "description": "Скрывает приложения из списка службы специальных возможностей Android на одном или нескольких облачных телефонах.\n- **Предварительные условия**: от 1 до 100 идентификаторов телефонов и от 1 до 100 имён пакетов. Телефоны должны принадлежать вашей команде, но им **не** нужно быть включёнными или занятыми вами. Если ни один из идентификаторов не разрешается, вызов возвращает бизнес-ошибку, а не системную ошибку.\n- **Эффект**: список отправляется Сервису и **не сохраняется в MoreLogin**, поэтому прочитать его обратно нельзя. Поддерживается на совместимых моделях; у других Сервисов вызов проходит успешно, но без эффекта.\n- **Завершение**: синхронное. На некоторых моделях каждый пакет отправляется отдельным вызовом Сервису, поэтому длинный список обрабатывается пропорционально дольше, а сбой на середине оставляет применёнными предыдущие пакеты.\n- **Примечание**: MoreLogin не проверяет версию Android; описанное ограничение по моделям исходит из возможностей Сервиса, а имена пакетов передаются дословно.",
        "tags": [
          "Apps"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Идентификаторы телефонов в облаке"
                  },
                  "packageName": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Название пакета приложения. Пустая строка эквивалентна очистке, а * или ALL скрывают все приложения."
                  }
                }
              },
              "example": {
                "ids": [
                  "0"
                ],
                "packageName": [
                  "*"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — одно значение типа boolean.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 = успех, >0 = ошибка"
                    },
                    "data": {
                      "type": "boolean"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение; заполняется, если код > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": true,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/page": {
      "post": {
        "summary": "Получение списка облачных профилей телефонов",
        "description": "Постранично выводит облачные телефоны, видимые аутентифицированной команде.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Примечание**: возвращаются телефоны всех Сервисов. Пароли платформенных и динамических прокси удаляются из ответа.\n- **Применение**: этот эндпоинт и `/cloudphone/info` служат сигналами завершения асинхронных операций включения и выключения, смены устройства в один клик и подготовки телефона.",
        "operationId": "pageUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "bindIp": {
                    "type": "boolean",
                    "description": "IP-адрес привязан: true = привязан, false = не привязан.",
                    "example": false
                  },
                  "keyword": {
                    "type": "string",
                    "description": "Ключевые слова для фильтрации: информация о прокси, имя группы, имя тега, имя среды.",
                    "example": "CP-424"
                  },
                  "pageNo": {
                    "type": "integer",
                    "format": "int64",
                    "description": "Текущая страница",
                    "example": 1
                  },
                  "pageSize": {
                    "type": "integer",
                    "format": "int64",
                    "description": "Количество элементов на странице",
                    "example": 100
                  },
                  "sort": {
                    "type": "array",
                    "description": "Поля с динамической сортировкой. В настоящее время для облачных телефонов поддерживается только поле \"envName\".",
                    "items": {
                      "type": "object",
                      "properties": {
                        "sortDirection": {
                          "type": "string",
                          "enum": [
                            "asc",
                            "desc"
                          ],
                          "description": "Направление сортировки",
                          "example": "asc"
                        },
                        "sortField": {
                          "type": "string",
                          "description": "Поле для сортировки (в настоящее время поддерживается только поле \"envName\")",
                          "example": "envName"
                        }
                      },
                      "required": [
                        "sortDirection",
                        "sortField"
                      ]
                    },
                    "example": [
                      {
                        "sortDirection": "asc",
                        "sortField": "envName"
                      }
                    ]
                  }
                },
                "example": {
                  "bindIp": false,
                  "keyword": "CP-424",
                  "pageNo": 1,
                  "pageSize": 100,
                  "sort": [
                    {
                      "sortDirection": "asc",
                      "sortField": "envName"
                    }
                  ]
                }
              },
              "example": {
                "bindIp": false,
                "keyword": "CP-424",
                "pageNo": 1,
                "pageSize": 100,
                "sort": [
                  {
                    "sortDirection": "asc",
                    "sortField": "envName"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Возвращаемый код результата 0: Нормальный. Остальные коды являются исключениями."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "сообщение об ошибке"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "current": {
                          "type": "string"
                        },
                        "dataList": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/CloudPhoneProfile"
                          }
                        },
                        "pages": {
                          "type": "string"
                        },
                        "total": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор запроса на операцию"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "current": "1",
                    "dataList": [
                      {
                        "abnormalStatus": 1,
                        "adbInfo": {
                          "adbIp": "string",
                          "adbPassword": "string",
                          "adbPort": "9222",
                          "remark": "example remark",
                          "success": 1
                        },
                        "billingType": 1,
                        "createDate": "2026-09-01 12:00:00",
                        "createMember": 1,
                        "createMemberName": "example-name",
                        "enableAdb": true,
                        "envName": "example-name",
                        "envRemark": "example remark",
                        "envStatus": 1,
                        "expireTime": "2026-09-01 12:00:00",
                        "groupId": "1673823102599682",
                        "groupName": "example-name",
                        "id": "1673823102599682",
                        "androidId": "1673823102599682",
                        "gaid": "1673823102599682",
                        "lastConnectDate": "2026-09-01 12:00:00",
                        "lastConnectMemberId": "1673823102599682",
                        "lastConnectMemberName": "example-name",
                        "lastStartDate": "2026-09-01 12:00:00",
                        "lastStartMemberId": "1673823102599682",
                        "lastStartMemberName": "example-name",
                        "proxy": {
                          "country": "string",
                          "countryCode": "string",
                          "createDate": "2026-09-01 12:00:00",
                          "delFlag": 1,
                          "expiryTime": "2026-09-01 12:00:00",
                          "exportIp": "9222",
                          "groupId": "1673823102599682",
                          "id": "1673823102599682",
                          "providerCode": "string",
                          "proxyAreaCode": "string",
                          "proxyCatagoryType": 1,
                          "proxyCheckStatus": 1,
                          "proxyInfo": "string",
                          "proxyIp": "string",
                          "proxyName": "example-name",
                          "proxyPort": 1,
                          "proxyRegionCode": "string",
                          "proxyStatus": 1,
                          "proxySub": {
                            "activeRecordId": "1673823102599682",
                            "businessId": "1673823102599682",
                            "createMember": 1,
                            "endTime": "2026-09-01 12:00:00",
                            "id": "1673823102599682",
                            "nextBillingTime": "2026-09-01 12:00:00",
                            "startTime": "2026-09-01 12:00:00",
                            "subPayMethod": "string",
                            "subStatus": 1,
                            "subType": 1,
                            "teamId": "1673823102599682"
                          },
                          "proxyType": 1,
                          "proxyTypeCode": "string",
                          "regionKey": "string",
                          "releaseTime": "2026-09-01 12:00:00",
                          "uniqueId": 1
                        },
                        "proxyStatus": 1,
                        "supportAdb": true,
                        "tagInfos": [
                          {
                            "id": "1673823102599682",
                            "tagName": "example-name"
                          }
                        ],
                        "updateDate": "2026-09-01 12:00:00",
                        "updateMember": 1
                      }
                    ],
                    "pages": "1",
                    "total": "1"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/link": {
      "post": {
        "summary": "Создать ссылку удалённого подключения к облачному телефону",
        "description": "Создаёт временную ссылку для доступа к облачному телефону через браузер (только Open API).\n\n- **Условия**: телефон принадлежит вашей команде, доступен вызывающему участнику, включён и не занят другим участником. API не включает телефон автоматически.\n- **Эффект**: каждый вызов создаёт новую ссылку без запроса учётных данных подключения и без изменения текущего подключения. Откройте `data.url` в браузере или создайте QR-код из полного URL.\n- **Срок действия**: ровно 5 минут с момента создания. Повторные переходы не расходуют и не продлевают ссылку. После истечения вызовите API снова. Поле `expiredTime` не возвращается; этот срок не относится к учётным данным подключения.\n- **Подключение**: каждый успешный переход запрашивает новые учётные данные подключения и перенаправляет на страницу управления; это может повлиять на предыдущее подключение. Неудачный переход можно повторить до истечения срока. Создание ссылки не гарантирует успешное последующее подключение.\n- **Хранение**: сохраняйте полный URL в тайне. Ответ содержит `Cache-Control: no-store`. Используйте возвращённый URL без изменений; адрес и параметры подключения определяет сервер.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`, `99002`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "createCloudPhoneRemoteLink",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID облачного телефона MoreLogin."
                  },
                  "lang": {
                    "type": "string",
                    "description": "Язык страницы, например `zh-CN` или `en-US`. Если значение отсутствует или пустое, используется язык запроса; неподдерживаемые значения заменяются настроенным языком по умолчанию. Язык включён в URL; параметр запроса `lang` можно изменить для переключения языка страницы."
                  }
                }
              },
              "example": {
                "id": "1710784536928649",
                "lang": "en-US"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успешно. `data.url` — временная ссылка для браузера, действительная 5 минут.",
            "headers": {
              "Cache-Control": {
                "description": "Не кешируйте этот ответ.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "no-store"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "example": 0
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "example": null
                    },
                    "data": {
                      "type": "object",
                      "required": [
                        "url"
                      ],
                      "properties": {
                        "url": {
                          "type": "string",
                          "format": "uri",
                          "description": "Временный URL для браузера. Храните полный URL как конфиденциальные учётные данные.",
                          "example": "https://gateway.example.com/app/cloudphone/qrcodeUrl?token=0123456789abcdef0123456789abcdef&lang=en-US"
                        }
                      }
                    },
                    "requestId": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "url": "https://gateway.example.com/app/cloudphone/qrcodeUrl?token=0123456789abcdef0123456789abcdef&lang=en-US"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "source": "curl --request POST 'https://api.morelogin.com/cloudphone/link' \\\n  --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\"id\":\"1710784536928649\",\"lang\":\"en-US\"}'"
          }
        ]
      }
    },
    "/cloudphone/create": {
      "post": {
        "summary": "Создание облачного телефона",
        "description": "Покупает и подготавливает один или несколько облачных телефонов.\n- **Предварительные условия**: в тарифе должна остаться ёмкость, а суточная квота создания не должна быть исчерпана. `country`, `timezone` и `language` проверяются по списку, который поддерживает выбранный Сервис, поэтому неподдерживаемая комбинация отклоняется, а не подгоняется незаметно. Координаты ограничены ±180 по долготе и ±90 по широте. Номер телефона отбрасывается, если выбранный SKU его не поддерживает. Месячные SKU можно создавать через API, если они возвращены [`/cloudphone/monthly/skus`](./open-api.yaml#operation/listMonthlyCloudPhoneSkus); текущий период — 30 дней.\n- **Эффект**: создаёт записи облачных телефонов. SKU с поминутной оплатой становятся доступными после подготовки; месячные создаются неактивными. Создание не списывает средства: месячные телефоны оплачиваются только через [`/cloudphone/monthly/activate`](./open-api.yaml#operation/activateMonthlyCloudPhones), а поминутные начинают расходовать баланс или квоту после включения.\n- **Завершение**: **принято, но не завершено.** Инстанс Сервиса ещё не готов, и слишком раннее включение отклоняется. Опрашивайте [`/cloudphone/info`](./open-api.yaml#operation/infoUsingPOST) или [`/cloudphone/page`](./open-api.yaml#operation/pageUsingPOST), пока `envStatus` не сообщит, что телефон выключен. Для месячного SKU перед включением также выполните [`/cloudphone/monthly/activate`](./open-api.yaml#operation/activateMonthlyCloudPhones).\n- **Повтор**: не идемпотентен и не сериализуется. Ключа идемпотентности нет. Не повторяйте слепо после таймаута: сначала запросите состояние.\n\nЗадокументированные бизнес-ошибки: `19064`, `20018`, `33338`, `33339`, `33340`, `33341`, `33342`, `33343`, `33344`, `33345`, `33398`, `33399`, `33400`, `33408`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "createUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "skuId": {
                    "type": "string",
                    "description": "Модель облачного телефона\nskuId:10002 model:Android 12\nskuId:10013 model:Android 13\nskuId:10005 model:Android 14\nskuId:10004 model:Android 15\nskuId:10014 model:Android 15A\nskuId:10015 model:Android 16\nПоддерживаемые регионы и соответствие часовых поясов см. в [таблице стран и часовых поясов](/api-reference/appendix/country-time-zone)\n"
                  },
                  "quantity": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 10,
                    "description": "Количество создаваемых облачных телефонов. Диапазон значений: [1-10]"
                  },
                  "envRemark": {
                    "type": "string",
                    "maxLength": 1500,
                    "description": "Примечание к профилю (не более 1500 символов)"
                  },
                  "groupId": {
                    "type": "string",
                    "description": "ID группы. Для «без группы» укажите `\"0\"`."
                  },
                  "groupName": {
                    "type": "string",
                    "maxLength": 50,
                    "description": "Название существующей группы либо название новой группы, которая будет создана, если совпадений нет."
                  },
                  "automaticGeo": {
                    "type": "boolean",
                    "description": "Подбирать ли географическое положение автоматически. По умолчанию: true"
                  },
                  "automaticLanguage": {
                    "type": "boolean",
                    "description": "Подбирать ли язык автоматически. По умолчанию: true"
                  },
                  "automaticLocation": {
                    "type": "boolean",
                    "description": "Подбирать ли местоположение (часовой пояс, страну) автоматически. По умолчанию: true"
                  },
                  "country": {
                    "type": "string",
                    "description": "Код страны (например `us`). Полный список см. в [таблице стран и часовых поясов](/api-reference/appendix/country-time-zone)"
                  },
                  "timezone": {
                    "type": "string",
                    "description": "Часовой пояс, например America/New_York"
                  },
                  "language": {
                    "type": "string",
                    "description": "Язык, например en-US"
                  },
                  "altitude": {
                    "type": "number",
                    "description": "Высота над уровнем моря"
                  },
                  "latitude": {
                    "type": "number",
                    "description": "Широта. Пример: 22.309182"
                  },
                  "longitude": {
                    "type": "number",
                    "description": "Долгота. Пример: 114.176817"
                  },
                  "speed": {
                    "type": "number",
                    "maximum": 400,
                    "description": "Скорость перемещения"
                  },
                  "bearing": {
                    "type": "number",
                    "maximum": 360,
                    "description": "Направление перемещения"
                  },
                  "accuracy": {
                    "type": "number",
                    "maximum": 100,
                    "description": "Горизонтальная точность"
                  },
                  "phoneNumber": {
                    "type": "string",
                    "description": "Собственный номер телефона. Требования к формату: должен начинаться со знака +, код страны — от 1 до 3 цифр (кроме 86), общая длина — от 8 до 14 цифр, допустимы только + и цифры."
                  },
                  "brand": {
                    "type": "string",
                    "description": "Бренд устройства. Его можно запросить через интерфейс https://guide.morelogin.com/api-reference/open-api/open-api/cloud-phone/paths/~1cloudphone~1brand~1models/post."
                  },
                  "modelId": {
                    "type": "number",
                    "description": "ID модели устройства. Его можно запросить через интерфейс https://guide.morelogin.com/api-reference/open-api/open-api/cloud-phone/paths/~1cloudphone~1brand~1models/post."
                  },
                  "proxyId": {
                    "type": "string",
                    "description": "ID прокси"
                  },
                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Названия меток. Пустые значения игнорируются."
                  }
                },
                "required": [
                  "skuId",
                  "quantity"
                ]
              },
              "example": {
                "skuId": "1661515884160372",
                "quantity": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Это идентификатор облачного телефона (ID облачного телефонаS)."
                    },
                    "requestId": {
                      "type": "string"
                    },
                    "error": {
                      "type": "object",
                      "properties": {}
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": [
                    "string"
                  ],
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "error": {}
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/powerOn": {
      "post": {
        "summary": "Стартап облачного телефона",
        "description": "Включает облачный телефон.\n- **Предварительные условия**: телефон должен быть выключен. Вызов отклоняется, когда SKU снят с продажи или на обслуживании, когда телефон занят другим участником, пока проверяется его прокси, когда на счёте задолженность или телефон деактивирован, когда истёк месячный период, а также когда недоступны ни бесплатные минуты, ни параллельный слот, ни положительный баланс. Некоторые модели дополнительно требуют последнюю версию клиента для Windows.\n- **Эффект**: помечает телефон как загружающийся, занимает его для вызывающего участника и резервирует параллельный слот либо начинает расходовать время. Ответ сообщает, что именно было использовано.\n- **Завершение**: **принято, но не завершено.** Опрашивайте `/cloudphone/info`, пока `envStatus` не станет «включён»; ошибка проявится там как `errorCode` и `errorMsg`. Участники с настроенным хостом обратного вызова также получают webhook.\n- **Повтор**: второй одновременный вызов отклоняется сразу, а не ставится в очередь. После таймаута прочитайте `/cloudphone/info`, а не отправляйте запрос заново.\n\nЗадокументированные бизнес-ошибки: `33300`, `33309`, `33315`, `33316`, `33317`, `33318`, `33321`, `33322`, `33323`, `33324`, `33325`, `33346`, `33347`, `33367`, `33376`, `33407`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "powerOnUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "disableMoneySavingMode": {
                    "type": "boolean",
                    "description": "Отключить режим энергосбережения, по умолчанию: false"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1637226321190925"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Возвращаемый код результата 0: Нормальный. Остальные коды являются исключениями."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор запроса на операцию"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/powerOff": {
      "post": {
        "summary": "Выключите облачный телефон",
        "description": "Выключает облачный телефон.\n- **Предварительные условия**: телефон должен загружаться или быть включён. Его нельзя выключить, пока он занят другим участником, а также пока выполняется смена устройства в один клик, перезагрузка или сброс.\n- **Эффект**: прекращает начисление платы, освобождает параллельный слот, закрывает учёт потребления и аннулирует выданные для сессии данные подключения. Выключение телефона, который ещё загружался, прерывает запуск, а не выключает его.\n- **Завершение**: плата и локальное состояние закрываются синхронно; выключение на стороне Сервиса продолжается после ответа, поэтому подтвердите через `/cloudphone/info`.\n- **Повтор**: второй вызов сообщит, что телефон не запущен. Пакеты прерываются на первой ошибке, поэтому перед повтором перечитайте состояние.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`, `33308`, `33331`, `33332`, `33333`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "powerOffUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1596527092376632"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Возвращаемый код результата 0: Нормальный. Остальные коды являются исключениями."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор запроса на операцию"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/edit/batch": {
      "post": {
        "summary": "Изменить профиль телефона в облаке",
        "description": "Обновляет конфигурацию одного или нескольких облачных телефонов.\n- **Предварительные условия**: телефоны должны принадлежать команде. Регион, язык и координаты проверяются по Сервису точно так же, как при создании. Перемещение телефона в группу, на которую у вас нет прав, отклоняется.\n- **Эффект**: перезаписывает настройки телефона и обновляет конфигурацию GPS; может создавать привязки меток. Плата не взимается, параллелизм не затрагивается.\n- **Завершение**: синхронное и идемпотентное при одинаковом теле запроса.",
        "operationId": "editBatchUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "ID облачных телефонов"
                  },
                  "envName": {
                    "type": "string",
                    "maxLength": 64,
                    "minLength": 1,
                    "description": "Название облачного телефона (не более 64 символов)"
                  },
                  "phoneNumber": {
                    "type": "string",
                    "description": "Собственный номер телефона. Требования к формату: должен начинаться со знака +, код страны — от 1 до 3 цифр (кроме 86), общая длина — от 8 до 14 цифр, допустимы только + и цифры."
                  },
                  "powerOnBillingStrategy": {
                    "type": "integer",
                    "enum": [
                      0,
                      1
                    ],
                    "description": "Способ тарификации для облачных телефонов без месячной подписки (0: по умолчанию, 1: только параллельный пакет)"
                  },
                  "proxyId": {
                    "type": "string",
                    "description": "ID прокси"
                  },
                  "groupId": {
                    "type": "string",
                    "description": "ID группы окружений"
                  },
                  "groupName": {
                    "type": "string",
                    "maxLength": 50,
                    "description": "Название существующей группы либо название новой группы, которая будет создана, если совпадений нет."
                  },
                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Названия меток на замену. Пустые значения игнорируются."
                  },
                  "envRemark": {
                    "type": "string",
                    "maxLength": 1500,
                    "description": "Примечание к окружению (не более 1500 символов, переносы строк поддерживаются)"
                  },
                  "automaticGeo": {
                    "type": "boolean",
                    "description": "Автоподбор геопозиции"
                  },
                  "automaticLanguage": {
                    "type": "boolean",
                    "description": "Автоподбор языка"
                  },
                  "automaticLocation": {
                    "type": "boolean",
                    "description": "Автоподбор местоположения (часовой пояс и страна)"
                  },
                  "country": {
                    "type": "string",
                    "description": "Страна"
                  },
                  "timezone": {
                    "type": "string",
                    "description": "Часовой пояс"
                  },
                  "language": {
                    "type": "string",
                    "description": "Язык"
                  },
                  "latitude": {
                    "type": "number",
                    "description": "Широта"
                  },
                  "longitude": {
                    "type": "number",
                    "description": "Долгота"
                  },
                  "enableRoot": {
                    "type": "boolean",
                    "description": "Включить глобальный ROOT"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": [
                  "1637238770951311"
                ],
                "proxyId": "0",
                "automaticGeo": false,
                "automaticLanguage": false,
                "automaticLocation": false,
                "country": "bo",
                "timezone": "America/La_Paz",
                "language": "de-CH",
                "latitude": 0,
                "longitude": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Возвращаемый код результата: 0, Normal. Остальные коды являются исключениями."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор запроса на операцию"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/setProxy": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Настройка прокси облачного телефона",
        "description": "Привязывает прокси к одному или нескольким облачным телефонам.\n- **Предварительные условия**: укажите хотя бы одно из `ids` или `uniqueIds`. Телефоны должны принадлежать вашей команде; включёнными им быть **не** обязательно. Если вы указываете `proxyId`, он должен существовать, иначе вызов отклоняется.\n- **Эффект**: если `proxyId` опущен или равен `0`, повторно используется существующий прокси с полностью совпадающими данными подключения, а **если совпадений нет, в вашей команде создаётся новая запись прокси**. Состояние проверки прокси сбрасывается, а предыдущий прокси запоминается.\n- **Завершение**: синхронное. **Включённые телефоны получают новый прокси немедленно — перезапуск не требуется**; выключенные подхватят его при следующем запуске.\n- **Повтор**: повторная привязка существующего `proxyId` идемпотентна, но повторение вызова с «сырыми» данными подключения может каждый раз создавать ещё одну запись прокси, когда дедупликация не срабатывает.\n\nЗадокументированные бизнес-ошибки: `33300`, `33303`, `33320`, `14023`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "setProxy",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneSetProxyApiDto"
              },
              "example": {
                "ids": [
                  "1558968155668507"
                ],
                "uniqueIds": [
                  1001
                ],
                "proxy": {
                  "proxyIp": "192.168.1.100",
                  "proxyPort": 8080,
                  "proxyProvider": 2
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` для этой операции всегда null; результат передаётся через `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 = успех, >0 = ошибка"
                    },
                    "data": {
                      "type": "null"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение; заполняется при code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": null,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/delete/batch": {
      "post": {
        "summary": "Удалить облачный телефон",
        "description": "Освобождает один или несколько облачных телефонов.\n- **Предварительные условия**: телефоны не должны находиться в процессе передачи, а у команды не должно быть неоплаченных заказов по ним. Телефон не обязан быть выключен.\n- **Эффект**: инстанс Сервиса освобождается сразу. Телефон, который никогда не активировался, удаляется полностью; активированный сохраняется как деактивированная запись, поэтому продолжает появляться в списках со статусом «деактивирован».\n- **Завершение**: синхронное.\n- **Повтор**: телефоны обрабатываются по одному, и вызов прерывается на первой ошибке, поэтому пакет может быть применён частично. Перечитайте `/cloudphone/page` перед повтором и повторяйте только для телефонов, которые всё ещё активны.",
        "operationId": "deleteUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "ids"
                ]
              },
              "example": {
                "ids": [
                  "1595755686723985"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Возвращаемый код результата 0: Нормальный. Остальные коды являются исключениями."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор запроса на операцию"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/newMachine": {
      "post": {
        "summary": "Новый облачный телефон в один клик",
        "description": "Заменяет идентичность устройства облачного телефона на месте (новое устройство в один клик).\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Если вы указываете бренд и модель, они должны поддерживаться SKU этого телефона. **Операция расходует суточную квоту создания облачных телефонов** — ту же, что использует `/cloudphone/create`.\n- **Эффект**: отправляет на устройство новый бренд и модель, очищает записи об установленных приложениях для этого телефона, сбрасывает его номер и прерывает любую выполняющуюся задачу ИИ. Точный набор идентификаторов, которые перегенерирует Сервис, MoreLogin не определяет.\n- **Завершение**: **принято, но не завершено.** Телефон переходит в состояние «новое устройство в один клик»; опрашивайте `/cloudphone/info`, пока он не покинет это состояние.\n- **Параллелизм**: пока операция выполняется, включение, выключение и все команды, требующие запущенного телефона, отклоняются. Второй одновременный вызов отклоняется, а не ставится в очередь.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`, `33326`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "oneNewUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Идентификатор телефона в облаке"
                  },
                  "brand": {
                    "type": "string",
                    "description": "Бренд"
                  },
                  "modelId": {
                    "type": "integer",
                    "description": "Идентификатор модели"
                  }
                }
              },
              "example": {
                "id": "1595372958075305"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 означает успех, >0 — неудачу."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  },
                  "required": [
                    "code",
                    "msg"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/info": {
      "post": {
        "summary": "Подробная информация о телефоне в облаке",
        "description": "Возвращает полные сведения об одном облачном телефоне, включая названия группы и меток.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Применение**: основной эндпоинт статуса для асинхронных операций. `envStatus` различает состояния «новый», «ошибка создания», «выключен», «загружается», «включён», «сбрасывается», «перезагружается» и «смена устройства в один клик выполняется»; `errorCode` и `errorMsg` содержат причину, когда асинхронная операция завершилась неудачно.",
        "operationId": "infoUsingPOST",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Идентификатор телефона в облаке"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1672532391231745"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "example": 0
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "example": null
                    },
                    "data": {
                      "$ref": "#/components/schemas/CloudPhoneDetail"
                    },
                    "requestId": {
                      "type": "string",
                      "example": "4d0f4fa68613441e9a11446a6437bb5a"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1673823102599682",
                    "androidId": "1673823102599682",
                    "gaid": "1673823102599682",
                    "envName": "example-name",
                    "groupId": "1673823102599682",
                    "groupName": "example-name",
                    "skuId": "1673823102599682",
                    "tagInfos": [
                      {
                        "id": "1673823102599682",
                        "tagName": "example-name"
                      }
                    ],
                    "billingType": 1,
                    "proxyStatus": 1,
                    "settings": {
                      "automaticGeo": true,
                      "automaticLocation": true,
                      "automaticLanguage": true,
                      "longitude": 1,
                      "latitude": 1
                    },
                    "device": {
                      "server": "string",
                      "countryName": "example-name",
                      "rom": 1,
                      "wifiBssid": "1673823102599682",
                      "bluetoothMac": "string"
                    },
                    "proxy": {
                      "id": "1673823102599682",
                      "proxyName": "example-name",
                      "proxyIp": "string"
                    },
                    "lastStartMemberId": "1673823102599682",
                    "lastStartMemberName": "example-name",
                    "lastStartDate": "2026-09-01 12:00:00",
                    "lastConnectMemberId": "1673823102599682",
                    "lastConnectMemberName": "example-name",
                    "lastConnectDate": "2026-09-01 12:00:00",
                    "envStatus": 1,
                    "abnormalStatus": 1,
                    "expireTime": "2026-09-01 12:00:00",
                    "envRemark": "example remark",
                    "createMember": "string",
                    "updateMember": "2026-09-01 12:00:00",
                    "updateDate": "2026-09-01 12:00:00",
                    "createDate": "2026-09-01 12:00:00",
                    "createMemberName": "example-name"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/queryByAndroidId": {
      "post": {
        "summary": "Получение сведений об облачном телефоне по AndroidId",
        "description": "Находит облачный телефон по Android ID, который сообщает устройство.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке. Телефон не обязан быть включён.\n- **Возвращает**: ту же структуру сведений, что и `/cloudphone/info`.\n- **Краевые случаи**: пустой `androidId` возвращает успех с `data` равным null, а не ошибку валидации; а если один Android ID совпадает у нескольких телефонов, произвольно возвращается один из них.",
        "operationId": "queryByAndroidId",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "androidId": {
                    "type": "string",
                    "description": "androidId облачного телефона",
                    "example": "8f7e6d5c4b3a2f1e"
                  }
                },
                "required": [
                  "androidId"
                ]
              },
              "example": {
                "androidId": "8f7e6d5c4b3a2f1e"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "example": 0
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "example": null
                    },
                    "data": {
                      "$ref": "#/components/schemas/CloudPhoneDetail"
                    },
                    "requestId": {
                      "type": "string",
                      "example": "4d0f4fa68613441e9a11446a6437bb5a"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "data": {
                    "id": "1673823102599682",
                    "androidId": "1673823102599682",
                    "gaid": "1673823102599682",
                    "envName": "example-name",
                    "groupId": "1673823102599682",
                    "groupName": "example-name",
                    "skuId": "1673823102599682",
                    "tagInfos": [
                      {
                        "id": "1673823102599682",
                        "tagName": "example-name"
                      }
                    ],
                    "billingType": 1,
                    "proxyStatus": 1,
                    "settings": {
                      "automaticGeo": true,
                      "automaticLocation": true,
                      "automaticLanguage": true,
                      "longitude": 1,
                      "latitude": 1
                    },
                    "device": {
                      "server": "string",
                      "countryName": "example-name",
                      "rom": 1,
                      "wifiBssid": "1673823102599682",
                      "bluetoothMac": "string"
                    },
                    "proxy": {
                      "id": "1673823102599682",
                      "proxyName": "example-name",
                      "proxyIp": "string"
                    },
                    "lastStartMemberId": "1673823102599682",
                    "lastStartMemberName": "example-name",
                    "lastStartDate": "2026-09-01 12:00:00",
                    "lastConnectMemberId": "1673823102599682",
                    "lastConnectMemberName": "example-name",
                    "lastConnectDate": "2026-09-01 12:00:00",
                    "envStatus": 1,
                    "abnormalStatus": 1,
                    "expireTime": "2026-09-01 12:00:00",
                    "envRemark": "example remark",
                    "createMember": "string",
                    "updateMember": "2026-09-01 12:00:00",
                    "updateDate": "2026-09-01 12:00:00",
                    "createDate": "2026-09-01 12:00:00",
                    "createMemberName": "example-name"
                  },
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/enableRoot": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Включение или выключение глобального ROOT",
        "description": "Включает или выключает глобальный переключатель ROOT для облачного телефона.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Поддерживается на совместимых устройствах; у других Сервисов вызов проходит успешно, но не даёт эффекта.\n- **Эффект**: в отличие от `/cloudphone/app/openRoot`, настройка **сохраняется** в записи настроек телефона и затем отправляется Сервису как переключатель для всего устройства.\n- **Завершение**: синхронное. MoreLogin не перезагружает телефон; когда изменение вступит в силу на устройстве, определяется поведением Сервиса.\n- **Повтор**: идемпотентен.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "enableRoot",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudPhoneEnableRootApiDTO"
              },
              "example": {
                "id": "1558968155668507",
                "enableRoot": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` для этой операции всегда null; результат передаётся через `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 = успех, >0 = ошибка"
                    },
                    "data": {
                      "type": "null"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение; заполняется при code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": null,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/screenCap": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Снимок экрана облачного телефона",
        "description": "Делает снимок экрана облачного телефона и возвращает URL для скачивания.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Поддерживается только на совместимых устройствах; остальные Сервисы отклоняют вызов.\n- **Эффект**: На некоторых моделях файл снимка удаляется с устройства после того, как он сделан.\n- **Завершение**: синхронное. Ответ содержит временный URL для скачивания изображения.\n- **Особенность**: На некоторых моделях сообщаемый срок истечения — фиксированный час с момента ответа, а `success` всегда равен true; это не реальный срок жизни подписи. Скачивайте изображение сразу, а не сохраняйте URL.\n- **Повтор**: побочных эффектов, кроме самого снимка, нет, поэтому повторять безопасно.",
        "operationId": "screenCap",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Идентификатор облачного телефона",
                    "example": "1558968155668507"
                  }
                }
              },
              "example": {
                "id": "1558968155668507"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — объект с полями `url`, `status`, `expireAt` и `success`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 = успех, >0 = ошибка"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "url": {
                          "type": "string",
                          "description": "URL доступа к снимку экрана",
                          "example": "http://oss.morelogin.com/test.png"
                        },
                        "status": {
                          "type": "string",
                          "description": "Status representing immediate completion (\"finish\") or pending status (\"pending\")",
                          "example": "finish"
                        },
                        "expireAt": {
                          "type": "string",
                          "description": "Метка времени истечения URL в миллисекундах (только для некоторых моделей)",
                          "example": "1756024767163"
                        },
                        "success": {
                          "type": "boolean",
                          "description": "Успешно сгенерировано",
                          "example": true
                        }
                      }
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение; заполняется при code > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": {
                    "url": "http://oss.morelogin.com/test.png",
                    "status": "finish",
                    "expireAt": "1756024767163",
                    "success": true
                  },
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/screenCapBase64": {
      "post": {
        "tags": [
          "Cloud Phone Management"
        ],
        "summary": "Снимок экрана облачного телефона (ответ base64)",
        "description": "Делает снимок экрана облачного телефона и возвращает изображение прямо в ответе в base64.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. **Поддерживается только на совместимых устройствах** — все остальные Сервисы отклоняют вызов.\n- **Завершение**: синхронное. При ошибке ответ содержит сообщение об ошибке вместо данных изображения, поэтому проверяйте `success` перед декодированием.\n- **Поддержка моделей**: по документации доступно только на образах Android 12 и Android 15.\n- **Применение**: предпочитайте этот эндпоинт вместо `/cloudphone/screenCap`, когда не хотите зависеть от URL, размещённого Сервисом.",
        "operationId": "screenCapBase64",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID облачного телефона",
                    "example": "1558968155668507"
                  }
                }
              },
              "example": {
                "id": "1558968155668507"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — объект с полями `captureBase64`, `errorMessage` и `success`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 = успех, >0 = ошибка"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "captureBase64": {
                          "type": "string",
                          "description": "Изображение в кодировке Base64",
                          "example": "data:image/png;base64,/9j/4AAQSkZJRgABAQAA....."
                        },
                        "errorMessage": {
                          "type": "string",
                          "description": "Сообщение об ошибке",
                          "example": "success"
                        },
                        "success": {
                          "type": "boolean",
                          "description": "Успешно сгенерировано",
                          "example": true
                        }
                      }
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение; заполняется при коде > 0"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "data": {
                    "captureBase64": "data:image/png;base64,/9j/4AAQSkZJRgABAQAA.....",
                    "errorMessage": "success",
                    "success": true
                  },
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/brand/models": {
      "post": {
        "operationId": "cloudphoneBrandModelsPost",
        "summary": "Запрос списка марок и моделей",
        "description": "Выводит бренды и модели устройств, поддерживаемые SKU облачного телефона.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке. Облачный телефон не задействован.\n- **Применение**: выберите допустимые `brand` и `modelId` перед вызовом `/cloudphone/create` или `/cloudphone/newMachine`; оба отклоняют комбинацию, которую этот эндпоинт не возвращает.\n- **Примечание**: неизвестный `skuId` даёт пустой список, а не ошибку.",
        "tags": [
          "Cloud Phone Management"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "skuId": {
                    "type": "string",
                    "description": "Идентификатор продукта облачного телефона"
                  }
                },
                "required": [
                  "skuId"
                ]
              },
              "example": {
                "skuId": "10002"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "requestId": {
                      "type": "string"
                    },
                    "timestamp": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "brand": {
                            "type": "string"
                          },
                          "model": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "timestamp": 1,
                  "data": [
                    {
                      "brand": "string",
                      "model": "string"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/updateAdb": {
      "post": {
        "summary": "Обновить статус ADB облачного телефона",
        "description": "Включает или выключает доступ по ADB на одном или нескольких облачных телефонах.\n- **Предварительные условия**: учитываются только телефоны, чей SKU поддерживает ADB; если ни один из переданных не подходит, вызов отклоняется. Телефоны, которым никогда не выделялся инстанс, пропускаются.\n- **Эффект**: устанавливает переключатель ADB у Сервиса и сохраняет его для телефонов, которые Сервис принял.\n- **Частичный сбой**: если часть телефонов обработана успешно, а часть нет, **вызов всё равно сообщает об ошибке**. Трактуйте ошибку как «часть телефонов могла быть изменена» и перечитайте состояние.\n- **Завершение**: синхронное. Данные подключения читайте через `/cloudphone/batchAdbInfo`, который возвращает данные только для включённых телефонов с поддержкой ADB.\n\nЗадокументированные бизнес-ошибки: `33350`, `33401`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "updateAdbUsingPOST",
        "tags": [
          "ADB"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "enableAdb": {
                    "type": "boolean"
                  },
                  "ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "enableAdb",
                  "ids"
                ]
              },
              "example": {
                "enableAdb": true,
                "ids": [
                  "1633612946805630"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Возвращаемый код результата 0: Нормальный. Остальные коды являются исключениями."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор запроса на операцию"
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/batchAdbInfo": {
      "post": {
        "tags": [
          "ADB"
        ],
        "summary": "Пакетный запрос информации ADB",
        "description": "Получает данные подключения ADB для не более чем 200 облачных телефонов.\n- **Предварительные условия**: телефоны должны принадлежать вашей команде. Занимать их **не** требуется. Данные получаются только для включённых телефонов, чей SKU поддерживает ADB.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Частичные результаты**: результаты соответствуют запрошенным идентификаторам и **никогда не падают целиком**. Когда данные недоступны, причина указана в `remark`: телефон не существует, не включён, не поддерживает ADB или запрос к Сервису не удался. Прочитайте `remark`, прежде чем считать пустую запись ошибкой.\n- **Разные Сервисы**: один запрос может охватывать телефоны разных Сервисов; служба группирует их внутри себя и объединяет результаты.\n- **Примечание**: сначала включите ADB через `/cloudphone/updateAdb`.",
        "operationId": "batchAdbInfoOpenApi",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApiBatchAdbInfoDto"
              },
              "example": {
                "envIds": [
                  "1674380838117474",
                  "1675787900043353"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Успех",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseDataListApiBatchAdbInfoResultDto"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": [
                    {
                      "id": "1674380838117474",
                      "supportAdb": true,
                      "envStatus": 4,
                      "adbIp": "192.168.1.100",
                      "adbPassword": "abc12345",
                      "adbPort": "5555",
                      "command": null,
                      "expireTime": null,
                      "remark": null
                    },
                    {
                      "id": "1675787900043353",
                      "supportAdb": true,
                      "envStatus": 4,
                      "adbIp": "10.0.0.50",
                      "adbPassword": "xyz78900",
                      "adbPort": "22",
                      "command": "ssh -L 5555:localhost:5555 user@10.0.0.50 -p 22",
                      "expireTime": "2026-05-23 12:00:00",
                      "remark": null
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/exeCommand": {
      "post": {
        "summary": "Выполнить команду оболочки",
        "description": "Выполняет shell-команду на облачном телефоне и возвращает её вывод.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды.\n- **Эффект**: полностью определяется командой. MoreLogin ничего не сохраняет и **не применяет ни белого списка команд, ни ограничения длины**; привилегии, с которыми выполняется команда, задаёт Сервис устройства. Если команде нужен root, включите глобальный root отдельно.\n- **Завершение**: синхронное — `data` содержит вывод команды, а не идентификатор задачи.\n- **Повтор**: журнала выполнения, к которому можно обратиться, нет, поэтому после таймаута результат остаётся неизвестным. Повторяйте только те команды, которые безопасно выполнять дважды.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "executeShellCommand",
        "tags": [
          "ADB"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID облачного телефона"
                  },
                  "command": {
                    "type": "string",
                    "description": "Shell-команда для выполнения"
                  }
                },
                "required": [
                  "id",
                  "command"
                ]
              },
              "example": {
                "command": "am start -n com.android.chrome/com.google.android.apps.chrome.Main",
                "id": "1674153897828425"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 означает успех, >0 — неудачу."
                    },
                    "data": {
                      "type": "string",
                      "description": "Информация об ответе"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Ответное сообщение: Если код больше 0, будет возвращено сообщение об ошибке."
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Уникальный идентификатор запроса; укажите его при обращении в поддержку"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg"
                  ]
                },
                "example": {
                  "code": 0,
                  "data": "string",
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d"
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/rpa/template/market/page": {
      "post": {
        "operationId": "cloudphoneRpaTemplateMarketPagePost",
        "summary": "Получите шаблоны страниц для рынка",
        "deprecated": false,
        "description": "Выводит шаблоны RPA из публичного маркетплейса.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке. Шаблоны глобальные, они не ограничены командой.\n- **Локализация**: заголовки и описания возвращаются на языке запроса.\n- **Применение**: `parameter` — это JSON-строка, описывающая переменные шаблона, и именно ей должен соответствовать `templateParameter` при создании расписания. Для шаблонов без переменных значение равно null.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "searchKey": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Название шаблона"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "По умолчанию: 1"
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "По умолчанию: 10"
                  }
                }
              },
              "example": {
                "searchKey": null,
                "pageNo": null,
                "pageSize": null
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Успех. `data.dataList` содержит записи запрошенной страницы и является пустым массивом при отсутствии совпадений; `data.total`, `data.current` и `data.pages` описывают постраничную разбивку.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 означает успех, >0 — неудачу."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор трассировки запроса"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string",
                                "description": "Заголовок шаблона рынка"
                              },
                              "parameter": {
                                "type": "string",
                                "description": "Параметр шаблона: строка JSON"
                              },
                              "description": {
                                "type": "string",
                                "description": "Описание шаблона рынка"
                              },
                              "appIconUrls": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "sort": {
                                "type": "integer",
                                "description": "сортировка"
                              },
                              "author": {
                                "type": "string",
                                "description": "автор"
                              },
                              "updateDate": {
                                "type": "string",
                                "description": "Время последнего обновления"
                              }
                            },
                            "required": [
                              "parameter"
                            ]
                          }
                        },
                        "current": {
                          "type": "string",
                          "description": "Текущий номер страницы"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Всего страниц"
                        },
                        "total": {
                          "type": "string",
                          "description": "Общее количество"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "title": "example-title",
                        "parameter": "{\"key\":\"value\"}",
                        "description": "example description",
                        "appIconUrls": [
                          "https://example.com/resource"
                        ],
                        "sort": 1,
                        "author": "example-author",
                        "updateDate": "2026-09-01 12:00:00"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/template/personal/page": {
      "post": {
        "operationId": "cloudphoneRpaTemplatePersonalPagePost",
        "summary": "Получите персональные шаблоны страниц",
        "deprecated": false,
        "description": "Выводит шаблоны RPA, созданные вашей командой.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Содержимое**: отдельное хранилище, не связанное с маркетплейсом, ограниченное вашей командой, с простыми одноязычными заголовками.\n- **Приоритет**: если идентификатор шаблона существует в обоих хранилищах, при создании расписания он разрешается в шаблон вашей команды.\n- **Применение**: `parameter` описывает переменные шаблона точно так же, как у шаблонов маркетплейса.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "searchKey": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Название шаблона"
                  },
                  "desc": {
                    "type": "string",
                    "description": "Описание шаблона"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "По умолчанию: 1"
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "По умолчанию: 10"
                  }
                }
              },
              "example": {
                "searchKey": null,
                "desc": "string",
                "pageNo": null
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Успех. `data.dataList` содержит записи запрошенной страницы и является пустым массивом при отсутствии совпадений; `data.total`, `data.current` и `data.pages` описывают постраничную разбивку.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 означает успех, >0 — неудачу."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор трассировки запроса"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string"
                              },
                              "title": {
                                "type": "string",
                                "description": "Заголовок шаблона рынка"
                              },
                              "parameter": {
                                "type": "string",
                                "description": "Параметр шаблона: строка JSON"
                              },
                              "description": {
                                "type": "string",
                                "description": "Описание шаблона рынка"
                              },
                              "appIconUrls": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "sort": {
                                "type": "integer",
                                "description": "сортировка"
                              },
                              "updateDate": {
                                "type": "string",
                                "description": "Время последнего обновления"
                              }
                            }
                          }
                        },
                        "current": {
                          "type": "string",
                          "description": "Текущий номер страницы"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Всего страниц"
                        },
                        "total": {
                          "type": "string",
                          "description": "Общее количество"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "title": "example-title",
                        "parameter": "{\"key\":\"value\"}",
                        "description": "example description",
                        "appIconUrls": [
                          "https://example.com/resource"
                        ],
                        "sort": 1,
                        "updateDate": "2026-09-01 12:00:00"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/task/page": {
      "post": {
        "operationId": "cloudphoneRpaTaskPagePost",
        "summary": "Получить список расписаний",
        "deprecated": false,
        "description": "Постранично выводит расписания RPA команды.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Применение**: `taskState` каждого расписания служит сигналом завершения для `/cloudphone/rpa/task/cancel`.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Включено ли расписание"
                  },
                  "searchKey": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Нечёткий поиск по названию расписания, описанию и заголовку шаблона"
                  },
                  "taskState": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Состояние расписания; 0: ожидает выполнения; 1: выполняется; 2: выполнение завершено 3: отменено\n"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "по умолчанию: 1"
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "по умолчанию: 10"
                  }
                }
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10,
                "taskState": 0,
                "searchKey": "daily login",
                "enabled": true
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Успех. `data.dataList` содержит записи запрошенной страницы и является пустым массивом при отсутствии совпадений; `data.total`, `data.current` и `data.pages` описывают постраничную разбивку.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 означает успех, >0 — неудачу."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор трассировки запроса"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "Идентификатор расписания"
                              },
                              "taskName": {
                                "type": "string",
                                "description": "Название задачи планирования"
                              },
                              "createMember": {
                                "type": "string",
                                "description": "Имя участника"
                              },
                              "enabled": {
                                "type": "boolean",
                                "description": "Включено ли"
                              },
                              "endTime": {
                                "type": "string",
                                "description": "Время окончания задачи"
                              },
                              "failCount": {
                                "type": "integer",
                                "description": "Количество неудачных выполнений"
                              },
                              "handleTime": {
                                "type": "string",
                                "description": "Время начала выполнения"
                              },
                              "notes": {
                                "type": "string",
                                "description": "примечания к расписанию"
                              },
                              "scheduleConfig": {
                                "type": "string",
                                "description": "Настройка расписания задач"
                              },
                              "successCount": {
                                "type": "integer",
                                "description": "Количество успешных исполнений"
                              },
                              "taskPreviewTimeTable": {
                                "type": "array",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "cloudPhoneId": {
                                      "type": "string",
                                      "description": "Идентификатор телефона в облаке"
                                    },
                                    "cloudPhoneName": {
                                      "type": "string",
                                      "description": "Название телефона в облаке"
                                    },
                                    "times": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      },
                                      "description": "Список времен выполнения"
                                    }
                                  }
                                }
                              },
                              "taskState": {
                                "type": "integer",
                                "description": "Состояние задачи планирования: 0: ожидание; 1: выполняется; 2: завершено; 3: Отмена."
                              },
                              "templateId": {
                                "type": "string",
                                "description": "Идентификатор шаблона"
                              },
                              "templateTitle": {
                                "type": "string",
                                "description": "Заголовок шаблона"
                              }
                            },
                            "required": [
                              "createMember"
                            ]
                          },
                          "description": "Плановый список"
                        },
                        "current": {
                          "type": "string",
                          "description": "Текущий номер страницы"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Всего страниц"
                        },
                        "total": {
                          "type": "string",
                          "description": "Общее количество"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "taskName": "example-name",
                        "createMember": "string",
                        "enabled": true,
                        "endTime": "2026-09-01 12:00:00",
                        "failCount": 1,
                        "handleTime": "2026-09-01 12:00:00",
                        "notes": "string",
                        "scheduleConfig": "string",
                        "successCount": 1,
                        "taskPreviewTimeTable": [
                          {
                            "cloudPhoneId": "1673823102599682",
                            "cloudPhoneName": "example-name",
                            "times": [
                              "2026-09-01 12:00:00"
                            ]
                          }
                        ],
                        "taskState": 1,
                        "templateId": "1673823102599682",
                        "templateTitle": "example-title"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/task/save": {
      "post": {
        "operationId": "cloudphoneRpaTaskSavePost",
        "summary": "Создание расписания",
        "deprecated": false,
        "description": "Сохранить запланированное задание облачного телефона.\n\ntemplateParameter Parameter Specification\n 1. __Parameter Source__\nParameter keys must be extracted from the `parameter` field returned by the following APIs:\n- Get market template pages\n- Get Personal template pages\n2.  __Data Structure__\n- Submit parameters in JSON object format: `{\"key1\": \"value1\", \"key2\": \"value2\"}`\n- Final parameter values must be deserialized according to business logic before use\n3. __Common Type Parameters__\nFor the following parameter types, pass values directly in the corresponding format:\n- string: `{\"name\": \"John\"}`\n- decimal / number: `{\"amount\": 100.50}`\n- boolean: `{\"enabled\": true}`\n4. __Media Type Parameters__\nFor media parameters such as image (pic) or video (video), in addition to basic information, a fixed key `\"__Extra__\"` must be included. Example format:\n```json\n{\n    \"__Extra__\": {\n        \"pic\": {\n            \"name\": \"pic_name\",\n            \"size\": 204800\n        },\n        \"video\": {\n            \"name\": \"video_name\",\n            \"size\": 204800000\n        }\n    },\n    \"pic\": \"https://get.morelogin.com/prod/cloudPhoneTaskVideo/1556061681934880/1c62314c7e2b4d298abe8d5452d7c050/test.png\",\n    \"video\": \"https://get.morelogin.com/pre/cloudPhoneTaskVideo/1542431036481556/4c4fed83685345ae8f1505fbe0c2f123/baby.mp4\"\n}\n```\n5. __Parameter Configuration Example__\nThe following example demonstrates how to configure the `templateParameter` parameter when saving a plan using a market template:\n- __Step 1: Retrieve Template Parameters__\nCall the Market Template API:\n`GET /api/cloudphone/rpa/template/market/page`\nExtract the `parameter` field from the response, for example:\n\n```json\n\"parameter\": \"{\\\"videoDownloadUrl\\\":{\\\"type\\\":\\\"video\\\",\\\"extra\\\":{\\\"name\\\":\\\"Select Video\\\",\\\"type\\\":\\\"video\\\",\\\"required\\\":true,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":1,\\\"sizeLimit\\\":{\\\"value\\\":200,\\\"unit\\\":\\\"MB\\\"},\\\"formatType\\\":[\\\"mp4\\\",\\\"mov\\\"]}},\\\"videoDescription\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Video Caption\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":1000},\\\"multiline\\\":{\\\"enabled\\\":true,\\\"value\\\":3},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":2}},\\\"coverUrl\\\":{\\\"type\\\":\\\"image\\\",\\\"extra\\\":{\\\"name\\\":\\\"Cover Image\\\",\\\"type\\\":\\\"image\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":3,\\\"sizeLimit\\\":{\\\"value\\\":5,\\\"unit\\\":\\\"MB\\\"},\\\"formatType\\\":[\\\"jpg\\\",\\\"png\\\",\\\"jpeg\\\"]}},\\\"enableAIGC\\\":{\\\"type\\\":\\\"boolean\\\",\\\"extra\\\":{\\\"name\\\":\\\"AI Label\\\",\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":4}},\\\"productId\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Product ID\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":50},\\\"placeholder\\\":\\\"Product ID only supports digits, with a maximum of 50 characters.\\\",\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":5}},\\\"productTitle\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Product Title\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":30},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":6}},\\\"getLeads\\\":{\\\"type\\\":\\\"boolean\\\",\\\"extra\\\":{\\\"name\\\":\\\"Get Leads\\\",\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":7}},\\\"comment\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Comment\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":200},\\\"multiline\\\":{\\\"enabled\\\":true,\\\"value\\\":3},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":8}}}\"\n```\n\n- __Step 2: Build the Parameter JSON__\nConstruct the JSON object according to the parameter requirements:\n```json\n{\n  \"__Extra__\": {\n    \"videoDownloadUrl\": {\n      \"name\": \"video_name.mp4\",\n      \"size\": 204800000\n    }\n  },\n  \"videoDownloadUrl\": \"https://get.morelogin.com/pre/cloudPhoneTaskVideo/1542431036481556/4c4fed83685345ae8f1505fbe0c2f123/baby.mp4\"\n}\n```\n- __Step 3: Escape the JSON String__\nConvert the JSON object into an escaped string format:\n```json\n\"{\\\"__Extra__\\\": {\\\"videoDownloadUrl\\\": {\\\"name\\\": \\\"video_name.mp4\\\",\\\"size\\\": 204800000}},\\\"videoDownloadUrl\\\": \\\"https://get.morelogin.com/pre/cloudPhoneTaskVideo/1542431036481556/4c4fed83685345ae8f1505fbe0c2f123/baby.mp4\\\"}\"\n```\n- __Step 4: API Call__\nPass the escaped string as the value of the `templateParameter` parameter to the target API.\n",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "taskName": {
                    "type": "string",
                    "description": "Название задачи"
                  },
                  "templateId": {
                    "type": "string",
                    "description": "ID шаблона"
                  },
                  "templateType": {
                    "type": "string",
                    "description": "Тип шаблона. PERSONAL:персональный; MARKET:маркетплейс"
                  },
                  "taskType": {
                    "type": "string",
                    "description": "Тип задачи. TEMPORARY или SCHEDULED"
                  },
                  "notes": {
                    "type": "string",
                    "description": "Заметки плана"
                  },
                  "cloudPhoneConfigs": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "cloudPhoneId": {
                          "type": "string",
                          "description": "ID облачного телефона"
                        },
                        "triggerTime": {
                          "type": "string",
                          "description": "Время выполнения задачи, часовой пояс UTC+0"
                        },
                        "templateParameter": {
                          "type": "string",
                          "description": "Параметры шаблона определяются в персональных или маркетплейс-шаблонах. Параметры в шаблоне определяются как:{\"Test\":{\"extra\":{\"type\":\"string\",\"required\":true,\"multiline\":{\"enabled\":false},\"name\":\"Test\",\"index\":1},\"type\":\"string\"}} При запросе параметров передаётся:{\"Test\":\"xxxx\"}"
                        }
                      },
                      "required": [
                        "cloudPhoneId",
                        "triggerTime",
                        "templateParameter"
                      ]
                    },
                    "description": "Коллекция конфигураций расписания облачных телефонов"
                  },
                  "scheduleConfig": {
                    "type": "object",
                    "properties": {
                      "endTime": {
                        "type": "string",
                        "description": "дата-время"
                      },
                      "scheduleType": {
                        "type": "string",
                        "description": "Тип расписания. ONCE:одноразовый; DAILY:ежедневный"
                      }
                    },
                    "required": [
                      "endTime",
                      "scheduleType"
                    ],
                    "description": "Конфигурация расписания задачи"
                  }
                },
                "required": [
                  "cloudPhoneConfigs",
                  "scheduleConfig",
                  "taskName",
                  "taskType",
                  "templateId",
                  "templateType"
                ]
              },
              "example": {
                "cloudPhoneConfigs": [
                  {
                    "cloudPhoneId": "1661515884160372",
                    "triggerTime": "string",
                    "templateParameter": "string"
                  }
                ],
                "scheduleConfig": {
                  "endTime": "string",
                  "scheduleType": "string"
                },
                "taskName": "example-name",
                "taskType": "string",
                "templateId": "1661515884160372",
                "templateType": "string"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — одно значение типа integer.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа, 0 означает успех, >0 означает ошибку"
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "ID трассировки запроса"
                    },
                    "data": {
                      "type": "integer",
                      "description": "ID расписания"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": 1
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/onceTask/save": {
      "post": {
        "operationId": "cloudphoneRpaOnceTaskSavePost",
        "summary": "Создание расписания на одну ночь",
        "deprecated": false,
        "description": "Сохранение запланированной задачи в облаке телефона\n\nСпецификация параметров шаблона\n\n__Источник параметров__\nКлючи параметров должны быть извлечены из поля `parameter`, возвращаемого следующими API:\n- Получение страниц шаблонов рынка\n- Получение страниц персональных шаблонов\n2. __Структура данных__\n- Передача параметров в формате объекта JSON: `{\"key1\": \"value1\", \"key2\": \"value2\"}`\n- Окончательные значения параметров должны быть десериализованы в соответствии с бизнес-логикой перед использованием\n3. __Общие типы параметров__\nДля следующих типов параметров передавайте значения непосредственно в соответствующем формате:\n- строка: `{\"name\": \"John\"}`\n- десятичное число: `{\"amount\": 100.50}`\n- логическое значение: `{\"enabled\": true}`\n4. __Параметры типа медиафайлов__\nДля параметров медиафайлов, таких как изображение (pic) или видео (video), в дополнение к основной информации, используется фиксированный ключ Необходимо включить `\"__Extra__\"`. Пример формата:\n```json\n{\n\"__Extra__\": {\n\"pic\": {\n\"name\": \"pic_name\",\n\"size\": 204800\n},\n\"video\": {\n\"name\": \"video_name\",\n\"size\": 204800000\n}\n\n},\n\"pic\": \"https://get.morelogin.com/prod/cloudPhoneTaskVideo/1556061681934880/1c62314c7e2b4d298abe8d5452d7c050/test.png\",\n\"video\": \"morelogin://cloudfile?ids=1,2\"\n}\n```\n5. __Пример настройки параметров__\nСледующий пример демонстрирует, как настроить параметр `templateParameter` при сохранении плана с использованием шаблона рынка:\n- __Шаг 1: Получение параметров шаблона__\nВызовите API шаблона рынка:\n`GET /api/cloudphone/rpa/template/market/page`\nИзвлеките поле `parameter` из ответа, например:\n\n```json\n\"parameter\": \"{\\\"videoDownloadUrl\\\":{\\\"type\\\":\\\"video\\\",\\\"extra\\\":{\\\"name\\\":\\\"Select Video\\\",\\\"type\\\":\\\"video\\\",\\\"required\\\":true,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":1,\\\"sizeLimit\\\":{\\\"value\\\":200,\\\"unit\\\":\\\"MB\\\"},\\\"formatType\\\":[\\\"mp4\\\",\\\"mov\\\"]}},\\\"videoDescription\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Video Caption\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":1000},\\\"multiline\\\":{\\\"enabled\\\":true,\\\"value\\\":3},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":2}},\\\"coverUrl\\\":{\\\"type\\\":\\\"image\\\",\\\"extra\\\":{\\\"name\\\":\\\"Cover Image\\\",\\\"type\\\":\\\"image\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":3,\\\"sizeLimit\\\":{\\\"value\\\":5,\\\"unit\\\":\\\"MB\\\"},\\\"formatType\\\":[\\\"jpg\\\",\\\"png\\\",\\\"jpeg\\\"]}},\\\"enableAIGC\\\":{\\\"type\\\":\\\"boolean\\\",\\\"extra\\\":{\\\"name\\\":\\\"AI Label\\\",\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":4}},\\\"productId\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Product ID\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":50},\\\"placeholder\\\":\\\"Идентификатор продукта поддерживает только цифры, максимум 50 символов.\\\",\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":5}},\\\"productTitle\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Название продукта\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":30},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":6}},\\\"getLeads\\\":{\\\"type\\\":\\\"boolean\\\",\\\"extra\\\":{\\\"name\\\":\\\"Get Leads\\\",\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":7}},\\\"comment\\\":{\\\"type\\\":\\\"string\\\",\\\"extra\\\":{\\\"name\\\":\\\"Comment\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false,\\\"charValid\\\":{\\\"enabled\\\":true,\\\"value\\\":200},\\\"multiline\\\":{\\\"enabled\\\":true,\\\"value\\\":3},\\\"defaultValue\\\":{\\\"enabled\\\":false},\\\"index\\\":8}}}\"\n```\n\n- __Шаг 2: Создание JSON-объекта параметров__\nСоздайте JSON-объект в соответствии с требованиями к параметрам:\n```json\n{\n\n\"__Extra__\": {\n\"videoDownloadUrl\": {\n\"name\": \"video_name.mp4\",\n\"size\": 204800000\n\n}\n\n},\n\"videoDownloadUrl\": \"morelogin://cloudfile?ids=1,2\"\n}\n```\n- __Шаг 3: Экранирование строки JSON__\nПреобразуйте объект JSON в экранированную строку:\n```json\n\"{\\\"__Extra__\\\": {\\\"videoDownloadUrl\\\": {\\\"name\\\": \\\"video_name.mp4\\\",\\\"size\\\": 204800000}},\\\"videoDownloadUrl\\\": \\\"morelogin://cloudfile?ids=1,2\\\"}\"\n```\n- __Шаг 4: Вызов API__\nПередайте экранированную строку в качестве значения параметра `templateParameter` целевому API.\n\nЗадокументированные бизнес-ошибки: `33814`, `33818`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "cloudPhoneId": {
                    "type": "string",
                    "description": "Идентификатор телефона в облаке"
                  },
                  "scheduleName": {
                    "type": "string",
                    "description": "Название расписания"
                  },
                  "templateId": {
                    "type": "string",
                    "description": "Идентификатор шаблона, персональный шаблон или идентификатор рыночного шаблона"
                  },
                  "templateParameter": {
                    "type": "string",
                    "description": "Параметры шаблона определяются в личных шаблонах или шаблонах рынка. Параметры в шаблоне определяются следующим образом: {\"Test\":{\"extra\":{\"type\":\"string\",\"required\":true,\"multiline\":{\"enabled\":false},\"name\":\"Test\",\"index\":1},\"type\":\"string\"}} При запросе параметров передается следующий параметр: {\"Test\":\"xxxx\"}"
                  },
                  "description": {
                    "type": "string",
                    "description": "Описание расписания"
                  }
                },
                "required": [
                  "cloudPhoneId",
                  "scheduleName",
                  "templateId"
                ]
              },
              "example": {
                "cloudPhoneId": "16783319661123",
                "scheduleName": "test",
                "templateId": "1678347487160256",
                "templateParameter": "{\"keyword\": \"abc\"}",
                "description": "описание расписания"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — одно значение типа integer.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 означает успех, >0 — неудачу."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор трассировки запроса"
                    },
                    "data": {
                      "type": "integer",
                      "description": "Идентификаторы расписаний"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": 1
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/task/cancel": {
      "post": {
        "operationId": "cloudphoneRpaTaskCancelPost",
        "summary": "Отменить расписание",
        "deprecated": false,
        "description": "Отменяет расписание RPA и все его незавершённые запуски.\n- **Предварительные условия**: расписание должно существовать в команде. Завершённое расписание отменить нельзя; уже отменённое возвращает успех и ничего не делает.\n- **Эффект**: расписание помечается отменённым **синхронно**, а для каждого запуска в состоянии ожидания, выполнения или проверки ставится в очередь запрос на отмену.\n- **Завершение**: смешанное. Состояние расписания читайте из `/cloudphone/rpa/task/page`, а отдельные запуски подтверждайте через `/cloudphone/rpa/subTask/page`: уже выполняющийся запуск останавливается асинхронно, а не сразу.\n- **Повтор**: идемпотентен.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Идентификатор плана"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1678919049331329"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Успех. `data` для этой операции всегда null; результат передаётся через `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 означает успех, >0 — неудачу."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор трассировки запроса"
                    },
                    "data": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": null
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/subTask/page": {
      "post": {
        "operationId": "cloudphoneRpaSubTaskPagePost",
        "summary": "Запись о выполнении задач запроса страницы",
        "deprecated": false,
        "description": "Постранично выводит отдельные запуски RPA.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Значения статуса**: `taskState` равен `0` ожидание, `1` выполняется, `2` в очереди, `3` успешно, `4` ошибка, `5` отменён. Ожидание и очередь различаются по тому, находится ли запуск всё ещё на своём исходном времени срабатывания.\n- **Особенность поиска**: поиск по заголовку шаблона сначала разрешает заголовки на языке текущего запроса, поэтому заголовок, не совпадающий с этим языком, вернёт пустую страницу, а не все запуски.",
        "tags": [
          "Schedules"
        ],
        "parameters": [],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "taskId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Идентификатор задачи"
                  },
                  "taskName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Название задачи",
                    "maxLength": 255,
                    "minLength": 1
                  },
                  "taskState": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Статус плана: 0: ожидание выполнения; 1: выполняется; 2: выполнение завершено; 3: отмена.",
                    "maximum": 9,
                    "minimum": 0
                  },
                  "templateId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Идентификатор шаблона",
                    "maximum": 99999999999,
                    "minimum": 0
                  },
                  "templateTitle": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Заголовок шаблона",
                    "maxLength": 255,
                    "minLength": 0
                  },
                  "cloudPhoneId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "идентификатор облачного телефона",
                    "example": "1559133625483282"
                  },
                  "cloudPhoneName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Название телефона в облаке",
                    "maxLength": 100,
                    "minLength": 0
                  },
                  "beginTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Время начала задачи: часовой пояс UTC+0",
                    "example": "2025-01-01 23:59:59"
                  },
                  "endTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Время окончания задачи: часовой пояс UTC+0\n\n",
                    "example": "2025-01-02 23:59:59"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "По умолчанию: 1",
                    "example": 1
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "По умолчанию: 10"
                  }
                }
              },
              "example": {
                "pageNo": 1,
                "pageSize": 10
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Успех. `data.dataList` содержит записи запрошенной страницы и является пустым массивом при отсутствии совпадений; `data.total`, `data.current` и `data.pages` описывают постраничную разбивку.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 означает успех, >0 — неудачу."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор трассировки запроса"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "dataList": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ExecutionDTO"
                          }
                        },
                        "current": {
                          "type": "string",
                          "description": "Текущий номер страницы"
                        },
                        "pages": {
                          "type": "string",
                          "description": "Всего страниц"
                        },
                        "total": {
                          "type": "string",
                          "description": "Общее количество"
                        }
                      },
                      "required": [
                        "current",
                        "dataList",
                        "pages",
                        "total"
                      ]
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "dataList": [
                      {
                        "id": "1673823102599682",
                        "taskName": "example-name",
                        "taskState": 1,
                        "cloudPhoneId": "1673823102599682",
                        "cloudPhoneName": "example-name",
                        "templateName": "example-name",
                        "handleFailCode": "string",
                        "handleFailReason": "string",
                        "handleResult": 1,
                        "handleResultAttachment": "string",
                        "handleTime": "2026-09-01 12:00:00",
                        "endTime": "2026-09-01 12:00:00",
                        "powerOnTime": "2026-09-01 12:00:00",
                        "triggerNextTime": "2026-09-01 12:00:00",
                        "triggerTime": "2026-09-01 12:00:00",
                        "createDate": "2026-09-01 12:00:00",
                        "createMember": "string",
                        "updateDate": "2026-09-01 12:00:00",
                        "updateMember": "2026-09-01 12:00:00"
                      }
                    ],
                    "current": "1",
                    "pages": "1",
                    "total": "1"
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/subTask/detail/{id}": {
      "post": {
        "operationId": "cloudphoneRpaSubTaskDetailIdPost",
        "summary": "Получить выполнение задачи",
        "deprecated": false,
        "description": "Возвращает сведения об одном запуске RPA.\n- **Предварительные условия**: запуск должен принадлежать вашей команде. Вызов завершается ошибкой, если запуска, его расписания или его облачного телефона больше не существует.\n- **Эффект**: отсутствует. Только чтение. Повтор безопасен при ограниченной выдержке.\n- **Значения статуса**: та же шкала, что и в `/cloudphone/rpa/subTask/page`.\n- **Примечание**: данные прокси разрешаются даже для прокси, которые с тех пор были удалены, поэтому исторический запуск по-прежнему показывает, какой прокси использовался.",
        "tags": [
          "Schedules"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Идентификатор задачи выполнения",
            "required": true,
            "example": 1678919049331331,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "taskId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Идентификатор задачи"
                  },
                  "taskName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Название задачи",
                    "maxLength": 255,
                    "minLength": 1
                  },
                  "taskState": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Статус плана: 0: ожидание выполнения; 1: выполняется; 2: выполнение завершено; 3: отмена.",
                    "maximum": 9,
                    "minimum": 0
                  },
                  "templateId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Идентификатор шаблона",
                    "maximum": 99999999999,
                    "minimum": 0
                  },
                  "templateTitle": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Заголовок шаблона",
                    "maxLength": 255,
                    "minLength": 0
                  },
                  "cloudPhoneId": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "идентификатор облачного телефона",
                    "example": "1559133625483282"
                  },
                  "cloudPhoneName": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Название телефона в облаке",
                    "maxLength": 100,
                    "minLength": 0
                  },
                  "beginTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Время начала задачи: часовой пояс UTC+0",
                    "example": "2025-01-01 23:59:59"
                  },
                  "endTime": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Время окончания задачи: часовой пояс UTC+0\n\n",
                    "example": "2025-01-02 23:59:59"
                  },
                  "pageNo": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "По умолчанию: 1",
                    "example": 1
                  },
                  "pageSize": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "По умолчанию: 10"
                  }
                }
              },
              "example": {
                "taskId": null,
                "taskName": null,
                "taskState": null
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Успех. `data` — объект с полями `id`, `taskName`, `taskState`, `cloudPhoneId`, `cloudPhoneName`, `templateName`, ….",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 означает успех, >0 — неудачу."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор трассировки запроса"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Идентификатор записи выполнения"
                        },
                        "taskName": {
                          "type": "string",
                          "description": "Название задачи планирования"
                        },
                        "taskState": {
                          "type": "integer",
                          "description": "Статус расписания: 0: ожидание выполнения; 1: выполняется; 2: выполнение завершено; 3: отмена."
                        },
                        "cloudPhoneId": {
                          "type": "string",
                          "description": "Идентификатор телефона в облаке"
                        },
                        "cloudPhoneName": {
                          "type": "string",
                          "description": "Название телефона в облаке"
                        },
                        "templateName": {
                          "type": "string",
                          "description": "Заголовок шаблона"
                        },
                        "handleFailCode": {
                          "type": "string",
                          "description": "код ошибки выполнения задачи"
                        },
                        "handleFailReason": {
                          "type": "string",
                          "description": "Причина сбоя задачи"
                        },
                        "handleResult": {
                          "type": "integer",
                          "description": "Результат выполнения задания: 0: неудача; 1: успех."
                        },
                        "handleResultAttachment": {
                          "type": "string",
                          "description": "Приложение с результатами выполнения задачи"
                        },
                        "handleTime": {
                          "type": "string",
                          "description": "Время выполнения"
                        },
                        "endTime": {
                          "type": "string",
                          "description": "Время окончания задачи"
                        },
                        "powerOnTime": {
                          "type": "string",
                          "description": "Время включения облачного телефона"
                        },
                        "triggerNextTime": {
                          "type": "string",
                          "description": "Следующее запланированное время срабатывания"
                        },
                        "triggerTime": {
                          "type": "string",
                          "description": "Запланированное время срабатывания"
                        },
                        "createDate": {
                          "type": "string",
                          "description": "Время создания"
                        },
                        "createMember": {
                          "type": "string",
                          "description": "Создатель"
                        },
                        "updateDate": {
                          "type": "string",
                          "description": "Время последнего обновления"
                        },
                        "updateMember": {
                          "type": "string",
                          "description": "Последний обновивший"
                        }
                      }
                    }
                  },
                  "required": [
                    "code",
                    "msg",
                    "data",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": {
                    "id": "1673823102599682",
                    "taskName": "example-name",
                    "taskState": 1,
                    "cloudPhoneId": "1673823102599682",
                    "cloudPhoneName": "example-name",
                    "templateName": "example-name",
                    "handleFailCode": "string",
                    "handleFailReason": "string",
                    "handleResult": 1,
                    "handleResultAttachment": "string",
                    "handleTime": "2026-09-01 12:00:00",
                    "endTime": "2026-09-01 12:00:00",
                    "powerOnTime": "2026-09-01 12:00:00",
                    "triggerNextTime": "2026-09-01 12:00:00",
                    "triggerTime": "2026-09-01 12:00:00",
                    "createDate": "2026-09-01 12:00:00",
                    "createMember": "string",
                    "updateDate": "2026-09-01 12:00:00",
                    "updateMember": "2026-09-01 12:00:00"
                  }
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/rpa/subTask/cancel/{id}": {
      "post": {
        "operationId": "cloudphoneRpaSubTaskCancelIdPost",
        "summary": "Отменить выполнение",
        "deprecated": false,
        "description": "Отменяет один запуск RPA, не затрагивая его расписание.\n- **Предварительные условия**: запись о запуске должна существовать в команде. Завершённый запуск отменить нельзя; уже отменённый возвращает успех и ничего не делает.\n- **Эффект**: **только ставит запрос на отмену в очередь — этот вызов не записывает никакого состояния.** Расписание продолжает работать, последующие запуски не затрагиваются. Чтобы остановить само расписание, используйте `/cloudphone/rpa/task/cancel`.\n- **Завершение**: асинхронное. Опрашивайте `/cloudphone/rpa/subTask/page` или сведения о запуске, пока состояние не станет «отменён». Уже выполняющийся запуск не останавливается мгновенно.\n- **Повтор**: идемпотентен; повтор лишь заново ставит запрос в очередь.",
        "tags": [
          "Schedules"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Идентификатор плана"
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "1678919049331329"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Успех. `data` для этой операции всегда null; результат передаётся через `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "integer",
                      "description": "Код ответа: 0 означает успех, >0 — неудачу."
                    },
                    "msg": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Сообщение об ошибке"
                    },
                    "requestId": {
                      "type": "string",
                      "description": "Идентификатор трассировки запроса"
                    },
                    "data": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "code",
                    "data",
                    "msg",
                    "requestId"
                  ]
                },
                "example": {
                  "code": 0,
                  "msg": null,
                  "requestId": "0d8b6f1c-9f4e-4d02-9d1a-7c3f5a1b2c3d",
                  "data": null
                }
              }
            },
            "headers": {}
          }
        }
      }
    },
    "/cloudphone/touch/click": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Касание - Нажатие",
        "description": "Нажимает точку на экране облачного телефона.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Поддерживается только на совместимых моделях; остальные Сервисы отклоняют вызов.\n- **Координаты**: `pos` должен содержать ровно два значения, `[x, y]`. **Они не сверяются с разрешением экрана** — точка за пределами экрана передаётся Сервису как есть.\n- **Завершение**: синхронное. `data.status` равен `finish`, когда жест выполнен, или `pending`, когда Сервис поставил его в очередь. Некоторые модели всегда сообщают `finish`. Эндпоинта для опроса жеста в состоянии `pending` нет.\n- **Повтор**: дедупликации нет. Два вызова — это два нажатия, поэтому слепой повтор после таймаута может дать двойное нажатие.\n- **Примечание**: `duration` здесь принимается, но игнорируется; его читает только долгое нажатие.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`, `33401`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "touchClick",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchClickRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos": [
                  540,
                  960
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Операция выполнена успешно",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/touch/doubleClick": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Касание - Двойное нажатие",
        "description": "Выполняет двойное нажатие точки на экране облачного телефона.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Поддерживается только на совместимых моделях; остальные Сервисы отклоняют вызов.\n- **Эффект**: На некоторых моделях это эмулируется четырьмя касаниями с фиксированными интервалами 50/100/50 мс, поэтому ритм нажатий не настраивается. `duration` игнорируется.\n- **Завершение**: синхронное. `data.status` равен `finish` или `pending`, как при одиночном нажатии.\n- **Повтор**: дедупликации нет; повторный вызов снова выполнит двойное нажатие.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`, `33401`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "touchDoubleClick",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchClickRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos": [
                  540,
                  960
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Операция выполнена успешно",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/touch/longClick": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Касание - Длительное нажатие",
        "description": "Выполняет долгое нажатие точки на экране облачного телефона.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Поддерживается только на совместимых моделях; остальные Сервисы отклоняют вызов.\n- **Значения**: `duration` — время удержания в миллисекундах, максимум 60000. **Нижней границы нет**, поэтому отрицательное значение проходит валидацию и передаётся Сервису. На некоторых моделях при отсутствии `duration` используется 1000 мс.\n- **Завершение**: синхронное. `data.status` равен `finish` или `pending`.\n- **Повтор**: дедупликации нет; повторный вызов снова выполнит нажатие.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`, `33401`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "touchLongClick",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchClickRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos": [
                  540,
                  960
                ],
                "duration": 2000
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Операция выполнена успешно",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/touch/swipe": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Касание - Свайп",
        "description": "Выполняет свайп между двумя точками на экране облачного телефона.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Поддерживается только на совместимых моделях; остальные Сервисы отклоняют вызов.\n- **Значения**: `pos1` — начальная точка, `pos2` — конечная, каждая ровно `[x, y]`. `duration` — время жеста в миллисекундах, максимум 60000; На некоторых моделях по умолчанию 300 мс, а траектория интерполируется в пять промежуточных событий перемещения.\n- **Завершение**: синхронное. `data.status` равен `finish` или `pending`.\n- **Повтор**: дедупликации нет; повторный вызов снова выполнит свайп.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`, `33401`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "touchSwipe",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchSwipeRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos1": [
                  540,
                  1500
                ],
                "pos2": [
                  540,
                  500
                ],
                "duration": 300
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Операция выполнена успешно",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/cloudphone/touch/drag": {
      "post": {
        "tags": [
          "Touch"
        ],
        "summary": "Касание - Перетаскивание",
        "description": "Выполняет перетаскивание между двумя точками на экране облачного телефона.\n- **Предварительные условия**: облачный телефон должен быть включён и не должен быть занят другим участником команды. Поддерживается только на совместимых моделях; остальные Сервисы отклоняют вызов.\n- **Примечание**: **На некоторых моделях это та же реализация, что и свайп** — служба передаёт перетаскивание прямо в процедуру свайпа, поэтому там их невозможно различить. У других моделей есть отдельное действие перетаскивания.\n- **Завершение**: синхронное. `data.status` равен `finish` или `pending`.\n- **Повтор**: дедупликации нет; повторный вызов снова выполнит перетаскивание.\n\nЗадокументированные бизнес-ошибки: `33300`, `33301`, `33401`. Значения кодов см. в [Error Codes](../Getting%20Started/error-codes.md). Любая операция может дополнительно вернуть общие коды.",
        "operationId": "touchDrag",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TouchSwipeRequest"
              },
              "example": {
                "id": "1558968155668507",
                "pos1": [
                  200,
                  500
                ],
                "pos2": [
                  800,
                  500
                ],
                "duration": 500
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Операция выполнена успешно",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TouchResultResponse"
                },
                "example": {
                  "code": 0,
                  "msg": "success",
                  "data": {
                    "status": "finish"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "Authorization": {
        "type": "http",
        "description": "Значение поля access_token из ответа интерфейса получения токена доступа",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "schemas": {
      "ResponseDataPageResultCloudPhoneAppDto": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Код статуса, 0 означает успех",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Описание",
            "example": "Success"
          },
          "data": {
            "description": "Данные ответа",
            "$ref": "#/components/schemas/PageResultCloudPhoneAppDto"
          }
        }
      },
      "PageResultCloudPhoneAppDto": {
        "type": "object",
        "properties": {
          "total": {
            "type": "string",
            "description": "Всего записей",
            "example": "15"
          },
          "current": {
            "type": "string",
            "description": "Номер текущей страницы",
            "example": "1"
          },
          "pages": {
            "type": "string",
            "description": "Всего страниц",
            "example": "2"
          },
          "dataList": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CloudPhoneAppDto"
            },
            "description": "Список приложений команды"
          }
        }
      },
      "CloudPhoneAppDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Идентификатор записи",
            "example": "123456"
          },
          "appName": {
            "type": "string",
            "description": "Название приложения",
            "example": "Facebook"
          },
          "packageName": {
            "type": "string",
            "description": "Имя пакета Android",
            "example": "com.facebook.katana"
          },
          "versionName": {
            "type": "string",
            "description": "Отображаемое имя версии",
            "example": "450.0.0.1"
          },
          "versionCode": {
            "type": "string",
            "description": "Код версии",
            "example": "450000000"
          },
          "enabled": {
            "type": "boolean",
            "description": "Включено ли приложение",
            "example": true
          },
          "desc": {
            "type": "string",
            "description": "Описание приложения",
            "example": "Social media application"
          },
          "enableRoot": {
            "type": "boolean",
            "description": "Включён ли ROOT-доступ для приложения",
            "example": false
          }
        }
      },
      "ApiAppRootOperateDto": {
        "type": "object",
        "required": [
          "id",
          "packageNames"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "ID облачного телефона",
            "example": "12345678"
          },
          "packageNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Список имён пакетов приложений, которым разрешён ROOT",
            "example": [
              "com.test"
            ]
          }
        }
      },
      "CloudPhoneSetProxyApiDto": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Список идентификаторов окружений облачных телефонов",
            "example": [
              "1558968155668507"
            ]
          },
          "uniqueIds": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Список отображаемых порядковых номеров окружений облачных телефонов (используется для сопоставления, если envIds не переданы)",
            "example": [
              1001
            ]
          },
          "proxy": {
            "description": "Настройки прокси",
            "$ref": "#/components/schemas/CloudPhoneProxyDto"
          }
        }
      },
      "CloudPhoneProxyDto": {
        "type": "object",
        "required": [
          "proxyIp",
          "proxyPort",
          "proxyProvider"
        ],
        "properties": {
          "proxyId": {
            "type": "string",
            "description": "Идентификатор конфигурации прокси (значение больше 0 означает повторное использование существующей конфигурации; пустое значение или <=0 означает создание/обновление прокси по последующим подробным параметрам)",
            "example": "10002"
          },
          "proxyIp": {
            "type": "string",
            "description": "IP-адрес прокси-сервера",
            "example": "192.168.1.100"
          },
          "proxyPort": {
            "type": "integer",
            "description": "Порт прокси-сервера",
            "minimum": 1,
            "maximum": 65535,
            "example": 8080
          },
          "proxyName": {
            "type": "string",
            "maxLength": 600,
            "description": "Название/описание конфигурации прокси",
            "example": "test_proxy_01"
          },
          "proxyProvider": {
            "type": "integer",
            "description": "Тип прокси 0:http, 1:https, 2:socks5",
            "example": 2
          },
          "username": {
            "type": "string",
            "maxLength": 200,
            "description": "Имя пользователя для аутентификации прокси",
            "example": "admin"
          },
          "password": {
            "type": "string",
            "maxLength": 100,
            "description": "Пароль для аутентификации прокси",
            "example": "pwd123"
          },
          "refreshUrl": {
            "type": "string",
            "description": "URL API для обновления IP динамического прокси",
            "example": "http://api.proxy.com/refresh"
          },
          "country": {
            "type": "string",
            "description": "Код страны расположения прокси (например, CN, US)",
            "example": "US"
          },
          "state": {
            "type": "string",
            "description": "Штат/область расположения прокси",
            "example": "California"
          },
          "city": {
            "type": "string",
            "description": "Город расположения прокси",
            "example": "Los Angeles"
          }
        }
      },
      "CloudPhoneEnableRootApiDTO": {
        "type": "object",
        "required": [
          "id",
          "enableRoot"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "ID облачного телефона",
            "example": "1558968155668507"
          },
          "enableRoot": {
            "type": "boolean",
            "description": "Включать ли глобальные ROOT-права на уровне системы",
            "example": true
          }
        }
      },
      "CloudPhoneProfile": {
        "type": "object",
        "properties": {
          "abnormalStatus": {
            "type": "integer",
            "description": "Аномальное состояние: 0 — Нет аномалий; 1 — Неактивировано; 2 — Не действует контракт; 3 — Перепродано; 4 — Деактивировано."
          },
          "adbInfo": {
            "$ref": "#/components/schemas/AdbInfo"
          },
          "billingType": {
            "type": "integer",
            "description": "Оплата: 0 — бесплатно, 1 — гибкая подписка, 2 — ежемесячно."
          },
          "createDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "createMember": {
            "type": "integer"
          },
          "createMemberName": {
            "type": "string"
          },
          "enableAdb": {
            "type": "boolean"
          },
          "envName": {
            "type": "string",
            "description": "Название облачного телефона"
          },
          "envRemark": {
            "type": "string",
            "description": "Примечания к биографии"
          },
          "envStatus": {
            "type": "integer",
            "description": "Статус профиля: 0 — Новый 1 — Создание не удалось 2 — Остановка 3 — Запуск 4 — Запуск 5 — Выполняется сброс"
          },
          "expireTime": {
            "type": "string",
            "description": "время истечения срока действия"
          },
          "groupId": {
            "type": "string"
          },
          "groupName": {
            "description": "Название группы. Null, если облачный телефон не входит ни в одну группу",
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "type": "string"
          },
          "androidId": {
            "type": "string",
            "description": "android id облачного телефона"
          },
          "gaid": {
            "type": "string",
            "description": "gaid облачного телефона"
          },
          "lastConnectDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "lastConnectMemberId": {
            "type": "string"
          },
          "lastConnectMemberName": {
            "type": "string"
          },
          "lastStartDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "lastStartMemberId": {
            "type": "string"
          },
          "lastStartMemberName": {
            "type": "string"
          },
          "proxy": {
            "$ref": "#/components/schemas/ProxyInfo"
          },
          "proxyStatus": {
            "type": "integer",
            "description": "Статус прокси: 0 — Не обнаружено; 1 — Обнаружение идёт; 2 — Обнаружение не удалось; 3 — Обнаружение успешно."
          },
          "supportAdb": {
            "type": "boolean"
          },
          "tagInfos": {
            "description": "Сведения о тегах. Пустой массив, если теги не назначены",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "description": "Идентификатор тега",
                  "type": "string"
                },
                "tagName": {
                  "description": "Название тега",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "tagName"
              ]
            }
          },
          "updateDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "updateMember": {
            "type": "integer"
          }
        }
      },
      "AdbInfo": {
        "type": "object",
        "properties": {
          "adbIp": {
            "type": "string",
            "description": "IP для ADB"
          },
          "adbPassword": {
            "type": "string",
            "description": "пароль подключения adb"
          },
          "adbPort": {
            "type": "string",
            "description": "порт adb"
          },
          "remark": {
            "type": "string",
            "description": "Информация о сбоях"
          },
          "success": {
            "type": "integer",
            "description": "Успешное приобретение: 1 = Да, 0 = Нет"
          }
        },
        "required": [
          "adbIp",
          "adbPassword",
          "adbPort",
          "remark",
          "success"
        ]
      },
      "ProxyInfo": {
        "type": "object",
        "properties": {
          "country": {
            "type": "string"
          },
          "countryCode": {
            "type": "string"
          },
          "createDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "delFlag": {
            "type": "integer",
            "description": "1 - удалено 2 - не удалено"
          },
          "expiryTime": {
            "type": "string"
          },
          "exportIp": {
            "type": "string"
          },
          "groupId": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "providerCode": {
            "type": "string"
          },
          "proxyAreaCode": {
            "type": "string"
          },
          "proxyCatagoryType": {
            "type": "integer",
            "description": "Тип прокси: 0: группа сайтов 1: облачная платформа 2: собственный IP-адрес 3: VPS 4: виртуальная машина"
          },
          "proxyCheckStatus": {
            "type": "integer",
            "description": "Статус обнаружения: 0: ожидание обнаружения 1: успешное обнаружение 2: сбой обнаружения 3: неизвестная ошибка"
          },
          "proxyInfo": {
            "type": "string"
          },
          "proxyIp": {
            "type": "string"
          },
          "proxyName": {
            "type": "string"
          },
          "proxyPort": {
            "type": "integer"
          },
          "proxyRegionCode": {
            "type": "string"
          },
          "proxyStatus": {
            "type": "integer",
            "description": "0 — Нормальный 1 — Ожидающее выделение 2 — Обновление 3 — Истек срок действия"
          },
          "proxySub": {
            "$ref": "#/components/schemas/ProxySubscription"
          },
          "proxyType": {
            "type": "integer",
            "description": "Тип прокси: 0-http 1-https 2-socks5 4-Oxylabs 5-Proxys.io 6-GeoSurf 9-Oxylabsauto 10-Trogan 11-Shadowsocks 12-vmess"
          },
          "proxyTypeCode": {
            "type": "string"
          },
          "regionKey": {
            "type": "string"
          },
          "releaseTime": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            "description": "Время выпуска: время удаления (если удалено), время истечения срока действия (если истекло)."
          },
          "uniqueId": {
            "type": "integer"
          }
        },
        "required": [
          "country",
          "countryCode",
          "createDate",
          "delFlag",
          "expiryTime",
          "exportIp",
          "groupId",
          "id",
          "providerCode",
          "proxyAreaCode",
          "proxyCatagoryType",
          "proxyCheckStatus",
          "proxyInfo",
          "proxyIp",
          "proxyName",
          "proxyPort",
          "proxyRegionCode",
          "proxyStatus",
          "proxySub",
          "proxyType",
          "proxyTypeCode",
          "regionKey",
          "releaseTime",
          "uniqueId"
        ]
      },
      "ProxySubscription": {
        "type": "object",
        "properties": {
          "activeRecordId": {
            "type": "string"
          },
          "businessId": {
            "type": "string"
          },
          "createMember": {
            "type": "integer"
          },
          "endTime": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "nextBillingTime": {
            "type": "string"
          },
          "startTime": {
            "type": "string"
          },
          "subPayMethod": {
            "type": "string"
          },
          "subStatus": {
            "type": "integer",
            "description": "Статус подписки: 0 — Ожидает подтверждения, 1 — Подписано, 2 — Отменено."
          },
          "subType": {
            "type": "integer",
            "description": "Тип подписки: 1 агент, 2 пакета."
          },
          "teamId": {
            "type": "string"
          }
        },
        "required": [
          "activeRecordId",
          "businessId",
          "createMember",
          "endTime",
          "id",
          "nextBillingTime",
          "startTime",
          "subPayMethod",
          "subStatus",
          "subType",
          "teamId"
        ]
      },
      "CloudPhoneDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "androidId": {
            "type": "string",
            "description": "android id облачного телефона"
          },
          "gaid": {
            "type": "string",
            "description": "gaid облачного телефона"
          },
          "envName": {
            "type": "string"
          },
          "groupId": {
            "type": "string"
          },
          "groupName": {
            "description": "Название группы. Null, если облачный телефон не входит ни в одну группу",
            "type": [
              "string",
              "null"
            ]
          },
          "skuId": {
            "type": "string"
          },
          "tagInfos": {
            "description": "Сведения о тегах. Пустой массив, если теги не назначены",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "description": "Идентификатор тега",
                  "type": "string"
                },
                "tagName": {
                  "description": "Название тега",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "tagName"
              ]
            }
          },
          "billingType": {
            "type": "integer"
          },
          "proxyStatus": {
            "type": "integer"
          },
          "settings": {
            "type": "object",
            "properties": {
              "automaticGeo": {
                "type": "boolean"
              },
              "automaticLocation": {
                "type": "boolean"
              },
              "automaticLanguage": {
                "type": "boolean"
              },
              "longitude": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "latitude": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "automaticGeo",
              "automaticLocation",
              "automaticLanguage",
              "longitude",
              "latitude"
            ]
          },
          "device": {
            "type": "object",
            "properties": {
              "server": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "countryName": {
                "type": "string"
              },
              "rom": {
                "type": "integer"
              },
              "wifiBssid": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "bluetoothMac": {
                "type": "string"
              }
            },
            "required": [
              "server",
              "countryName",
              "rom",
              "wifiBssid",
              "bluetoothMac"
            ]
          },
          "proxy": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "proxyName": {
                "type": "string"
              },
              "proxyIp": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "proxyName",
              "proxyIp"
            ]
          },
          "lastStartMemberId": {
            "type": "string"
          },
          "lastStartMemberName": {
            "type": [
              "string",
              "null"
            ]
          },
          "lastStartDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "lastConnectMemberId": {
            "type": "string"
          },
          "lastConnectMemberName": {
            "type": [
              "string",
              "null"
            ]
          },
          "lastConnectDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "envStatus": {
            "type": "integer"
          },
          "abnormalStatus": {
            "type": "integer"
          },
          "expireTime": {
            "type": "string"
          },
          "envRemark": {
            "type": "string"
          },
          "createMember": {
            "type": "string"
          },
          "updateMember": {
            "type": "string"
          },
          "updateDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "createDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$"
          },
          "createMemberName": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "envName",
          "groupId",
          "skuId",
          "tagInfos",
          "billingType",
          "proxyStatus",
          "settings",
          "device",
          "proxy",
          "lastStartMemberId",
          "lastStartMemberName",
          "lastStartDate",
          "lastConnectMemberId",
          "lastConnectMemberName",
          "lastConnectDate",
          "envStatus",
          "abnormalStatus",
          "expireTime",
          "envRemark",
          "createMember",
          "updateMember",
          "updateDate",
          "createDate",
          "createMemberName"
        ]
      },
      "ApiBatchAdbInfoDto": {
        "type": "object",
        "required": [
          "envIds"
        ],
        "properties": {
          "envIds": {
            "type": "array",
            "description": "Список идентификаторов окружений, максимум 200",
            "maxItems": 200,
            "minItems": 1,
            "items": {
              "type": "string"
            },
            "example": [
              "1674380838117474",
              "1675787900043353"
            ]
          }
        }
      },
      "ApiBatchAdbInfoResultDto": {
        "type": "object",
        "description": "Результат пакетного запроса ADB-информации",
        "properties": {
          "id": {
            "type": "string",
            "description": "Идентификатор окружения"
          },
          "supportAdb": {
            "type": "boolean",
            "description": "Поддерживается ли ADB"
          },
          "enableAdb": {
            "type": "boolean",
            "description": "Включение ADB: 0 = выключено, 1 = включено"
          },
          "envStatus": {
            "type": "integer",
            "description": "Статус окружения:\n- 0: новое\n- 1: ошибка создания\n- 2: выключено\n- 3: запускается\n- 4: включено\n- 5: сбрасывается\n- 6: перезапускается\n- 7: выполняется смена устройства в один клик"
          },
          "adbIp": {
            "type": [
              "string",
              "null"
            ],
            "description": "IP-адрес ADB-подключения"
          },
          "adbPassword": {
            "type": [
              "string",
              "null"
            ],
            "description": "Пароль ADB-подключения"
          },
          "adbPort": {
            "type": [
              "string",
              "null"
            ],
            "description": "Порт ADB-подключения"
          },
          "command": {
            "type": [
              "string",
              "null"
            ],
            "description": "Команда подключения по ADB через SSH-туннель"
          },
          "expireTime": {
            "type": [
              "string",
              "null"
            ],
            "description": "Срок действия ADB-подключения"
          },
          "remark": {
            "type": [
              "string",
              "null"
            ],
            "description": "Примечание. Если ADB-информацию получить нельзя, указывается причина:\n- окружение не существует\n- окружение не включено, ADB-информацию запросить нельзя\n- это окружение не поддерживает ADB\n- не удалось получить ADB-информацию"
          }
        }
      },
      "ResponseDataListApiBatchAdbInfoResultDto": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Код ответа, 0 означает успех",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Сообщение ответа",
            "example": "success"
          },
          "data": {
            "type": "array",
            "description": "Список ADB-информации в том же порядке, что и запрошенные envIds",
            "items": {
              "$ref": "#/components/schemas/ApiBatchAdbInfoResultDto"
            }
          }
        }
      },
      "ExecutionDTO": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Идентификатор записи выполнения"
          },
          "taskName": {
            "type": "string",
            "description": "Название задачи планирования"
          },
          "taskState": {
            "type": "integer",
            "description": "Статус расписания: 0: ожидание выполнения; 1: выполняется; 2: выполнение завершено; 3: отмена."
          },
          "cloudPhoneId": {
            "type": "string",
            "description": "Идентификатор телефона в облаке"
          },
          "cloudPhoneName": {
            "type": "string",
            "description": "Название телефона в облаке"
          },
          "templateName": {
            "type": "string",
            "description": "Заголовок шаблона"
          },
          "handleFailCode": {
            "type": "string",
            "description": "код ошибки выполнения задачи"
          },
          "handleFailReason": {
            "type": "string",
            "description": "Причина сбоя задачи"
          },
          "handleResult": {
            "type": "integer",
            "description": "Результат выполнения задания: 0: неудача; 1: успех."
          },
          "handleResultAttachment": {
            "type": "string",
            "description": "Приложение с результатами выполнения задачи"
          },
          "handleTime": {
            "type": "string",
            "description": "Время выполнения"
          },
          "endTime": {
            "type": "string",
            "description": "Время окончания задачи"
          },
          "powerOnTime": {
            "type": "string",
            "description": "Время включения облачного телефона"
          },
          "triggerNextTime": {
            "type": "string",
            "description": "Следующее запланированное время срабатывания"
          },
          "triggerTime": {
            "type": "string",
            "description": "Запланированное время срабатывания"
          },
          "createDate": {
            "type": "string",
            "description": "Время создания"
          },
          "createMember": {
            "type": "string",
            "description": "Создатель"
          },
          "updateDate": {
            "type": "string",
            "description": "Время последнего обновления"
          },
          "updateMember": {
            "type": "string",
            "description": "Последний обновивший"
          }
        }
      },
      "TouchClickRequest": {
        "type": "object",
        "required": [
          "id",
          "pos"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "ID облачного телефона",
            "example": "1558968155668507"
          },
          "pos": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "minItems": 2,
            "maxItems": 2,
            "description": "Координаты нажатия [x, y]. Система координат использует левый верхний угол экрана как начало координат (0, 0).",
            "example": [
              540,
              960
            ]
          },
          "duration": {
            "type": "integer",
            "description": "Длительность нажатия в миллисекундах (используется для длительного нажатия). Если не указано, используется значение по умолчанию.",
            "example": 2000
          }
        }
      },
      "TouchSwipeRequest": {
        "type": "object",
        "required": [
          "id",
          "pos1",
          "pos2"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "ID облачного телефона",
            "example": "1558968155668507"
          },
          "pos1": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "minItems": 2,
            "maxItems": 2,
            "description": "Начальные координаты [x, y]",
            "example": [
              540,
              1500
            ]
          },
          "pos2": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "minItems": 2,
            "maxItems": 2,
            "description": "Конечные координаты [x, y]",
            "example": [
              540,
              500
            ]
          },
          "duration": {
            "type": "integer",
            "description": "Длительность свайпа/перетаскивания в миллисекундах. Большее значение приводит к более медленному действию.",
            "example": 300
          }
        }
      },
      "TouchResultResponse": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Код статуса, 0 означает успех",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Сообщение ответа",
            "example": "success"
          },
          "data": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "description": "Статус выполнения",
                "example": "finish"
              }
            }
          }
        }
      },
      "ResponseEnvelopeBase": {
        "type": "object",
        "required": [
          "code",
          "msg",
          "requestId"
        ],
        "properties": {
          "code": {
            "type": "integer",
            "description": "Business result code; `0` indicates success",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Error message; null when successful",
            "example": null
          },
          "requestId": {
            "type": "string",
            "description": "Request ID for troubleshooting",
            "example": "1d4f3ea968664593860b94b35d4ebf5e"
          }
        }
      },
      "MonthlyCloudPhoneSkuPrice": {
        "type": "object",
        "required": [
          "price",
          "period",
          "periodUnit"
        ],
        "properties": {
          "price": {
            "type": "integer",
            "minimum": 0,
            "description": "Configured price in US cents"
          },
          "period": {
            "type": "integer",
            "description": "Billing-period count returned by the product service"
          },
          "periodUnit": {
            "type": "string",
            "description": "Localized billing-period unit returned by the product service"
          },
          "priceDesc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Localized display price, when configured"
          }
        }
      },
      "MonthlyCloudPhoneSku": {
        "type": "object",
        "required": [
          "skuId",
          "skuName",
          "prices"
        ],
        "properties": {
          "skuId": {
            "type": "string",
            "description": "Monthly Cloud Phone product ID"
          },
          "skuName": {
            "type": "string",
            "description": "Product name returned in the product-service language"
          },
          "cloudPhoneAndroidVersion": {
            "type": [
              "string",
              "null"
            ],
            "description": "Android version, or null when the product has no configured value"
          },
          "cloudPhoneStorage": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Storage capacity in GB, or null when the product has no configured value"
          },
          "prices": {
            "type": "array",
            "minItems": 1,
            "description": "Active monthly price configurations",
            "items": {
              "$ref": "#/components/schemas/MonthlyCloudPhoneSkuPrice"
            }
          }
        }
      },
      "MonthlyCloudPhoneActivateRequest": {
        "type": "object",
        "required": [
          "ids"
        ],
        "properties": {
          "ids": {
            "type": "array",
            "minItems": 1,
            "maxItems": 10,
            "uniqueItems": true,
            "description": "One to ten distinct positive Cloud Phone IDs, encoded as strings to preserve 64-bit precision",
            "items": {
              "type": "string",
              "pattern": "^[1-9][0-9]*$"
            }
          }
        }
      },
      "MonthlyCloudPhoneActivationResult": {
        "type": "object",
        "required": [
          "id",
          "status"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Cloud Phone ID"
          },
          "status": {
            "type": "string",
            "enum": [
              "ACTIVATED",
              "FAILED",
              "UNKNOWN"
            ],
            "description": "Activation result"
          },
          "expireTime": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^[0-9]+$",
            "description": "Unix time in milliseconds; present for a successful activation"
          },
          "errorCode": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Business error code for a failed item"
          }
        }
      },
      "MonthlyCloudPhoneActivationData": {
        "type": "object",
        "required": [
          "orderId",
          "orderStatus",
          "results"
        ],
        "properties": {
          "orderId": {
            "type": "string",
            "description": "Paid balance-order ID"
          },
          "orderStatus": {
            "type": "integer",
            "enum": [
              1
            ],
            "description": "Order status; 1 means completed"
          },
          "results": {
            "type": "array",
            "description": "One result per requested ID, in request order",
            "items": {
              "$ref": "#/components/schemas/MonthlyCloudPhoneActivationResult"
            }
          }
        }
      },
      "CloudPhoneLiveStartRequest": {
        "type": "object",
        "required": [
          "phoneId",
          "fileId"
        ],
        "properties": {
          "phoneId": {
            "type": "string",
            "description": "Cloud phone ID",
            "example": "190000000000000001"
          },
          "fileId": {
            "type": "string",
            "description": "ID of an uploaded MP4 live-streaming file (`uploadType=2`)",
            "example": "820000000000000001"
          }
        }
      },
      "CloudPhoneLivePhoneRequest": {
        "type": "object",
        "required": [
          "phoneId"
        ],
        "properties": {
          "phoneId": {
            "type": "string",
            "description": "Cloud phone ID",
            "example": "190000000000000001"
          }
        }
      }
    },
    "responses": {
      "BalanceResponse": {
        "description": "Request processed; inspect `code` for the business result",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "balance",
                        "remainingDuration",
                        "remainingConcurrency"
                      ],
                      "properties": {
                        "balance": {
                          "type": "integer",
                          "format": "int32",
                          "description": "Available wallet balance in cents"
                        },
                        "remainingDuration": {
                          "type": "string",
                          "pattern": "^[0-9]+$",
                          "description": "Remaining cloud phone duration in minutes, serialized as a numeric string"
                        },
                        "remainingConcurrency": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Remaining team-level cloud phone concurrency"
                        }
                      }
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "balance": 12500,
                "remainingDuration": "120",
                "remainingConcurrency": 3
              },
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      },
      "MonthlyCloudPhoneSkusResponse": {
        "description": "Request processed; `data` is an empty array when no monthly product is available",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MonthlyCloudPhoneSku"
                      }
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": [
                {
                  "skuId": "10015",
                  "skuName": "Android 14",
                  "cloudPhoneAndroidVersion": "Android 14",
                  "cloudPhoneStorage": 64,
                  "prices": [
                    {
                      "price": 2500,
                      "period": 30,
                      "periodUnit": "days",
                      "priceDesc": "$25/30 days"
                    }
                  ]
                }
              ],
              "requestId": "36d574df5b9e41b5b3c796133ff5a079"
            }
          }
        }
      },
      "MonthlyCloudPhoneActivateResponse": {
        "description": "Request processed; inspect `code`, and inspect `data.results` when returned",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MonthlyCloudPhoneActivationData"
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "orderId": "1724032801202461",
                "orderStatus": 1,
                "results": [
                  {
                    "id": "1724032706822188",
                    "status": "ACTIVATED",
                    "expireTime": "1791103955843",
                    "errorCode": null
                  }
                ]
              },
              "requestId": "db5e04c2eb804cdfb96b1469c7379bbc"
            }
          }
        }
      },
      "CloudPhoneLiveBooleanResponse": {
        "description": "Request processed; inspect `code` for the business result",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "boolean",
                      "description": "Whether the live-streaming operation succeeded"
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": true,
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      },
      "CloudPhoneLiveStatusResponse": {
        "description": "Request processed; inspect `code` for the business result",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ResponseEnvelopeBase"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "liveStatus": {
                          "type": "integer",
                          "enum": [
                            0,
                            1
                          ],
                          "description": "Live status (`0` = stopped, `1` = running)"
                        },
                        "writeFileId": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Current file ID, when available"
                        },
                        "liveFilePath": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Current file path or URL, when available"
                        }
                      }
                    }
                  }
                }
              ]
            },
            "example": {
              "code": 0,
              "msg": null,
              "data": {
                "liveStatus": 1,
                "writeFileId": "820000000000000001",
                "liveFilePath": null
              },
              "requestId": "1d4f3ea968664593860b94b35d4ebf5e"
            }
          }
        }
      }
    }
  },
  "servers": [
    {
      "url": "https://api.morelogin.com",
      "description": "MoreLogin Open API endpoint"
    }
  ],
  "security": [
    {
      "Authorization": []
    }
  ]
}